【问题标题】:Using JsonConvert.DeserializeObject on JSON with dynamic object name [duplicate]在具有动态对象名称的 JSON 上使用 JsonConvert.DeserializeObject [重复]
【发布时间】:2018-11-06 13:07:52
【问题描述】:

我在让 JsonConvert.DeserializeObject 与对象名称是动态的一些 JSON 一起工作时遇到了一些问题,这使得反序列化为 C# 对象变得困难。这就是我通常会做的事情——这对于具有可预测架构的 JSON 非常有效:

var dynData = (MyType)JsonConvert.DeserializeObject(jsonString, typeof(MyType));

传入的 JSON 如下所示,注意对象名称“2000314370”是动态的,不会每次都相同。 JSON 由第 3 方提供,因此我无法控制它。

{
  "status":"ok",
  "meta":{"count":1},
  "data":{
       "2000314370":[
              {"all": {"f1":972,"f2":0,"f3":0.09}}
                    ]
         }
}

使用http://jsonutils.com/,我生成了它认为正确的类结构,但它当然包含对动态对象的引用:

public class 2000314370
{
    public All all { get; set; }
}

public class Data
{
    public IList<2000314370> 2000314370 { get; set; }
}

我是否能够声明类并将动态 JSON 反序列化为它,还是必须使用不同的方法?

【问题讨论】:

标签: c# json json.net json-deserialization


【解决方案1】:

将根对象的data 属性更改为字符串字典和包含的数据类型。在这种情况下,它是一个对象数组。

public class Meta {
    public int count { get; set; }
}

public class All {
    public int f1 { get; set; }
    public int f2 { get; set; }
    public double f3 { get; set; }
}

public class Data {
    public All all { get; set; }
}

public class MyType {
    public string status { get; set; }
    public Meta meta { get; set; }
    public IDictionary<string, IList<Data>> data { get; set; }
}

现在反序列化时

var dynData = JsonConvert.DeserializeObject<MyType>(jsonString);
All all =  dynData.data["2000314370"][0].all; //  {"f1":972,"f2":0,"f3":0.09}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 2012-11-11
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多