2014-06-23 42 views
0

我已经返回这一个API:反序列化多行与DataContractJsonSerializer类

{ 
"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": " ", 
     "SSD": "  ", 
     "TAF": " E", 
     "TEACHING": "PROVA FINALE CFU 5", 
     "YEAR": 3 
    } 
} 

我试图解析它丝毫DataContractJsonSerializer类......我maked支持类是这样的:

[DataContract] 
public class Exam 
{ 
    [DataMember(Name = "CFU", IsRequired = true)] 
    private string cfu; 
    [DataMember(Name = "RESULT", IsRequired = true)] 
    private string result; 
    [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; } 

} 

如果我使用列表,它不起作用......并以这种方式,解析是非常缓慢......有没有解决方案?在此先感谢

+0

您是否特别需要为此使用'DataContractSerializer'? JSON.Net将相当简单地反序列化成一个'Dictionary'。 – Corey

+0

我会试试看,谢谢! –

回答

0

在您的响应对象EXAMS_LIST应定义为Dictionary<int, Exam>。问题是DataContractJsonSerializer无法正确处理字典。你最好的选择是使用Newtonsoft的JSON.NET。这里是你如何与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")); 
0

源使用的格式是一个Dictionary兼容而不是更常见的ListArray,所以简短的回答是使用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.Net版本,亲自。一旦你通过设置对象告诉它使用简单的字典格式,DataContractJsonSerializer版本就可以工作。

+0

谢谢大家,解答:D –

相关问题