反序列化JSON转换成使用DataContractJsonSerializer一个C#动态对象

问题描述 投票:1回答:3

我在那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

c# json
3个回答
0
投票

你可以反序列化简单对象词典:

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;}
}

0
投票

你可以做到以下几点:

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;  
}

0
投票

如果您要访问像errors.error1.name etc..对象数据,那么可以考虑使用dynamicExpandoObject。这是一个工作示例

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

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.