使用DataContractJsonSerializer将Json反序列化为C#动态对象
我的问题与我想要反序列化动态json数据的问题相同。换句话说,键:“error1等是动态的。在我的例子中:使用DataContractJsonSerializer将Json反序列化为C#动态对象,c#,json,C#,Json,我的问题与我想要反序列化动态json数据的问题相同。换句话说,键:“error1等是动态的。在我的例子中: { "errors" : { "error1" : { "name" : "connection error", "location" : "CPU board", "id" : "E0001" }, "warning2" : {
{
"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
反序列化到字典中。我还发现,使用JavascriptSerializer
也可以做类似的事情
我想我可以用它们来解决我的问题,但我的问题是,我也可以用
DataContractJsonSerializer
?将其反序列化为对象字典:
var result = JsonConvert.DeserializeObject<Error>(json);
var result=JsonConvert.DeserializeObject(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;
}
公共类错误
{
公开课详情
{
公共字符串名称{get;set}
公共字符串Id{get;set}
公共字符串位置{get;set}
}
公共字典错误{get;set;}
}
您可以将其反序列化为简单的对象字典:
var result = JsonConvert.DeserializeObject<Error>(json);
var result=JsonConvert.DeserializeObject(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;
}
公共类错误
{
公开课详情
{
公共字符串名称{get;set}
公共字符串Id{get;set}
公共字符串位置{get;set}
}
公共字典错误{get;set;}
}
您可以执行以下操作:
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;
}
您可以执行以下操作:
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;
}
如果您想访问对象数据,如<代码> Error .Error .No.等。< /代码>,然后考虑使用<代码>动态< /代码>和<代码> ExpObject Obj/C>。这里是一个工作示例
using (var f = new StreamReader("json1.json"))
{
string json = f.ReadToEnd();
dynamic deserializedObject = JsonConvert.DeserializeObject<ExpandoObject>(json);
Console.WriteLine(deserializesObject.errors.error1.name);
}
使用(var f=newstreamreader(“json1.json”))
{
字符串json=f.ReadToEnd();
dynamic deserializedObject=JsonConvert.DeserializeObject(json);
WriteLine(反序列化sobject.errors.error1.name);
}
输出:连接错误
希望这有帮助。
< P>如果你想访问对象数据,比如<代码> Error .Error .No.等。< /代码>,然后考虑使用<代码>动态< /代码>和<代码> ExpObject Obj/C>。这里是一个工作例子using (var f = new StreamReader("json1.json"))
{
string json = f.ReadToEnd();
dynamic deserializedObject = JsonConvert.DeserializeObject<ExpandoObject>(json);
Console.WriteLine(deserializesObject.errors.error1.name);
}
使用(var f=newstreamreader(“json1.json”))
{
字符串json=f.ReadToEnd();
dynamic deserializedObject=JsonConvert.DeserializeObject(json);
WriteLine(反序列化sobject.errors.error1.name);
}
输出:连接错误
我希望这能有所帮助。是的,谢谢。使用DataContractJsonSerializer如何?您需要在类中使用DataContract和DataMember属性:我的意思是如何使用DataContractJsonSerializer执行上述操作(我知道DataContract是必需的)是的,谢谢。使用DataContractJsonSerializer如何?您需要在类中使用DataContract和DataMember属性:我的意思是如何使用DataContractJsonSerializer执行上述操作(我知道DataContract是必需的)这是假设Error是对象的类。如果不是,则用类替换Error。这是假设Error是对象的类。如果不是,则用类替换Error。