在动态对象名

时间:2018-05-28 01:00:19

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

我遇到一些问题,让JsonConvert.DeserializeObject与一些JSON一起使用,其中对象名称是动态的,这使得很难去反映到C#对象中。这是我通常会做的 - 对于具有可预测模式的JSON,它可以正常工作:

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

传入的JSON看起来像这样,注意到对象名称“2000314370”是动态的,并且每次都不一样。 JSON由第三方提供,因此我无法控制它。

{
  "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反序列化,或者我是否必须使用不同的方法?

1 个答案:

答案 0 :(得分:3)

将根对象的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}}