Десериализация нескольких строк с помощью класса DataContractJsonSerializer

#c# #.net #windows-phone-8

#c# #.net #windows-телефон-8

Вопрос:

У меня есть API, который возвращает это:

 {
"CODE": 200,
"EXAMS_LIST": {
    "0": {
        "CFU": " 9",
        "RESULT": "SOSTENUTO",
        "SSD": " MAT/05",
        "TAF": " A",
        "TEACHING": "MATEMATICA I CFU 9",
        "YEAR": 1
    },
    "1": {
        "CFU": " 4",
        "RESULT": "Sufficiente",
        "SSD": " L-LIN/12",
        "TAF": " E",
        "TEACHING": "LINGUA INGLESE (COLLOQUIO)",
        "YEAR": 1
    },
    "2": {
        "CFU": " 6",
        "RESULT": "SOSTENUTO",
        "SSD": " FIS/01",
        "TAF": " A",
        "TEACHING": "FISICA CFU 6",
        "YEAR": 1
    },
    ...........
    "22": {
        "CFU": " 5",
        "RESULT": "amp;nbsp;",
        "SSD": " amp;nbsp;",
        "TAF": " E",
        "TEACHING": "PROVA FINALE CFU 5",
        "YEAR": 3
    }
}
 

Я пытаюсь разобрать его с помощью класса DataContractJsonSerializer… я создал класс поддержки таким образом:

 [DataContract]
public class Exam
{
    [DataMember(Name = "CFU", IsRequired = true)]
    private string cfu;
    [DataMember(Name = "RESULT", IsRequired = true)]
    private string resu<
    [DataMember(Name = "SSD")]
    private string ssd;
    [DataMember(Name = "TAF")]
    private string taf;
    [DataMember(Name = "TEACHING", IsRequired = true)]
    private string teaching;
    [DataMember(Name = "YEAR", IsRequired = true)]
    private string year;

    public string Cfu
    {
        get { return cfu; }
        set { cfu = value; }
    }
    .........
    public string Year
    {
        get { return year; }
        set { year = value; }
    }
}}


[DataContract]
public class StudyPlanResponse
{
    [DataMember(Name="CODE")]
    public string Code {get;set;}
    [DataMember(Name = "EXAMS_LIST")]
    public ExamList Exams { get; set; }


}

[DataContract]
public class ExamList
{

    [DataMember(Name = "0")]
    public Exam ex0 { get; set; }
    [DataMember(Name = "1")]
    public Exam ex1 { get; set; }
    ............
    [DataMember(Name = "30")]
    public Exam ex30 { get; set; }

}
 

Если я использую List, он не работает … и таким образом, синтаксический анализ выполняется очень медленно … есть ли какое-либо решение? заранее спасибо

Комментарии:

1. Вам особенно нужно было использовать DataContractSerializer для этого? JSON. Net десериализует это в Dictionary довольно просто.

Ответ №1:

В вашем ответе объект EXAMS_LIST должен быть определен как Dictionary<int, Exam> . Проблема в том, что DataContractJsonSerializer не может правильно обрабатывать словари. Лучше всего использовать JSON.NET от Newtonsoft. Вот как вы могли бы это сделать с JSON.NET:

Измените EXAMS_LIST на Dictionary<int, Exam>

 [DataContract]
public class StudyPlanResponse
{
    [DataMember(Name = "CODE")]
    public string Code { get; set; }            
    [DataMember(Name = "EXAMS_LIST")]
    public Dictionary<int, Exam> Exams { get; set; }
}
 

Вызов JSON.NET

 StudyPlanResponse response = JsonConvert.DeserializeObject<StudyPlanResponse>(File.ReadAllText("TextFile1.json"));
 

Ответ №2:

В исходном коде используется формат, совместимый с a Dictionary , а не с более распространенным List or Array , поэтому короткий ответ — использовать a Dictionary для десериализации EXAMS_LIST элемента.

Два ответа, оба с использованием следующей структуры:

 public class StudyPlanResponse
{
    public int CODE { get; set; }
    public Dictionary<int, Exam> EXAMS_LIST { get; set; }

    public class Exam
    {
        public string CFU { get; set; }
        public string RESULT { get; set; }
        public string SSD { get; set; }
        public string TAF { get; set; }
        public string TEACHING { get; set; }
        public int YEAR { get; set; }
    }
}
 

Во-первых, с помощью JSON.Net :

 StudyPlanResponse studyplan = JsonConvert.DeserializeObject<StudyPlanResponse>(jsrc);
 

Во-вторых, используя DataContractJsonSerializer :

 var settings = new DataContractJsonSerializerSettings();
settings.UseSimpleDictionaryFormat = true;

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(StudyPlanResponse), settings);
StudyPlanResponse studyplan;
using (var stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(jsrc)))
{
    studyplan = (StudyPlanResponse)ser.ReadObject(stream);
}
 

Я предпочитаю JSON.Чистая версия, лично я. DataContractJsonSerializer Версия работает, как только вы укажете ей использовать формат простого словаря через объект настроек.