将JSON字符串反序列化为C#中的嵌套类?

将JSON字符串反序列化为C#中的嵌套类?

问题描述:

我是从,看起来像这样的HTTP请求接收一个JSON字符串返回:将JSON字符串反序列化为C#中的嵌套类?

[ 
    { 
    "size":590, 
    "location":"California", 
    "report":{ 
    "Bob":[ 
     null, 
     "12.0.250.0", 
     "20130228" 
    ], 
    "Mary":[ 
     null, 
     "2013-02-28.01", 
     "20130228" 
    ], 
    "John":[ 
     null, 
     "12.00", 
     "59123805" 
    ] 
    } 
}, 
{ 
    "size":12348, 
    "location":"Florida", 
    "report":{ 
    "Misty":[ 
     null, 
     "65492.592", 
     "89216753" 
    ], 
    "Billy":[ 
     null, 
     "789208.w9", 
     "65320880" 
    ], 
    "John":[ 
     null, 
     "89.8056", 
     "75920889" 
    ] 
    } 
} 
] 

,我试图反序列化到类的结构如下所示:

[DataContract] 
public class DeserializedObject 
{ 
    [DataMember(Name = "size")] 
    public UInt64 Size { get; set; } 

    [DataMember(Name = "location")] 
    public string Location { get; set; } 

    [DataMember(Name = "report")] 
    public Dictionary<string, ReportData> Report { get; set; } 
} 

[CollectionDataContract] 
public class ReportData : List<object> 
{ 
    public string a 
    { 
     get { return (string)this[0]; } 
     set { this[0] = (string)value; } 
    } 

    public string b 
    { 
     get { return (string)this[1]; } 
     set { this[1] = (string)value; } 
    } 

    public string c 
    { 
     get { return (string)this[2]; } 
     set { this[2] = (string)value; } 
    } 
} 

当我尽管试图反序列化它,但报告总是空的。

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<DeserializedObject>)); 
List<DeserializedObject> list = serializer.ReadObject(stream) as List<DeserializedObject>; 

什么是反序列化JSON响应的“报告”部分的正确方法?

+0

它是空的Dictionary对象或纯空? – Vlad 2013-03-15 22:05:27

+0

这是一个空的Dictionary对象。 – 2013-03-15 22:14:57

问题是您的报告类未正确设置。 json.NET正在寻找关键字a,b和c。除此之外,字典中的值是一个字符串数组,而不是一个对象。 ReportData一个对象。这种不匹配是导致错误的原因。

我认为改为报告应该只是从项目中删除<string, string[]>ReportData类型的字典。如果我要这样做,我会使用下面的类(DataContract的东西实际上并不是必须的);

public class DeserializedObject 
    { 
     public UInt64 size { get; set; } 

     public string location { get; set; } 

     public Dictionary<string, string[]> report { get; set; } 
    } 
+0

我试着为报告使用Dictionary ,它仍然返回一个空的(非空)Dictionary对象。我也试过使用字典>,并没有工作。 – 2013-03-18 15:46:06

我能够使用Json.NET成功地反序列化JSON字符串。我用反序列化的串类看起来是这样的:

[DataContract] 
public class DeserializedObject 
{ 
    [DataMember(Name = "size")] 
    public UInt64 Size { get; set; } 

    [DataMember(Name = "location")] 
    public string Location { get; set; } 

    [DataMember(Name = "report")] 
    public Dictionary<string, string[]> Report { get; set; } 
} 

,并用于反序列化对象的代码如下所示:

StreamReader reader = new StreamReader(stream); 
List<DeserializedObject> instance = JsonConvert.DeserializeObject<List<DeserializedObject>>(reader.ReadToEnd());