我在那this question我想反序列化JSON动态数据的相同问题。换句话说,键:“ERROR1等是动态的,在我的情况:
{
"errors" : {
"error1" : {
"name" : "connection error",
"location" : "CPU board",
"id" : "E0001"
},
"warning2" : {
"name" : "Value not formatted",
"location" : "Controller",
"id" : "W005"
},
"info4" : {
"name" : "Attention to temperature",
"location" : "Heater",
"id" : "I008"
}
}
}
在这个问题的答案使用JsonConvert
反序列化到字典中。我发现也here类似的东西可以用JavascriptSerializer
完成。
我想,我可以使用这些解决我的问题,但我的问题是,我也可以这样做使用DataContractJsonSerializer
?
你可以反序列化简单对象词典:
var result = JsonConvert.DeserializeObject<Error>(json);
执行类似以下的类:
public class Error
{
public class Details
{
public string Name {get;set}
public string Id {get;set}
public string Location {get;set}
}
public Dictionary<string, Details> Errors {get;set;}
}
你可以做到以下几点:
using(MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
Error deserializedError = new Error();
DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedError.GetType());
deserializedError = ser.ReadObject(ms) as Error;
}
如果您要访问像errors.error1.name etc..
对象数据,那么可以考虑使用dynamic
和ExpandoObject
。这是一个工作示例
using (var f = new StreamReader("json1.json"))
{
string json = f.ReadToEnd();
dynamic deserializedObject = JsonConvert.DeserializeObject<ExpandoObject>(json);
Console.WriteLine(deserializesObject.errors.error1.name);
}
输出:connection error
我希望这有帮助。