将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响应的“报告”部分的正确方法?
答
问题是您的报告类未正确设置。 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
答
我能够使用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());
它是空的Dictionary对象或纯空? – Vlad 2013-03-15 22:05:27
这是一个空的Dictionary对象。 – 2013-03-15 22:14:57