使用DataContractJsonSerializer将Json反序列化为C#动态对象

使用DataContractJsonSerializer将Json反序列化为C#动态对象,c#,json,C#,Json,我的问题与我想要反序列化动态json数据的问题相同。换句话说,键:“error1等是动态的。在我的例子中: { "errors" : { "error1" : { "name" : "connection error", "location" : "CPU board", "id" : "E0001" }, "warning2" : {

我的问题与我想要反序列化动态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
反序列化到字典中。我还发现,使用
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。