#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
Версия работает, как только вы укажете ей использовать формат простого словаря через объект настроек.