在 JSON 上使用 JsonConvert.DeserializeObject 和动态对象名称
Using JsonConvert.DeserializeObject on JSON with dynamic object name
我在让 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/ 我生成了它认为正确的 class 结构,但当然它包括对动态对象的引用:
public class 2000314370
{
public All all { get; set; }
}
public class Data
{
public IList<2000314370> 2000314370 { get; set; }
}
我可以声明 classes 并将动态 JSON 反序列化到它,还是我必须使用不同的方法?
将根对象的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}}
我在让 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/ 我生成了它认为正确的 class 结构,但当然它包括对动态对象的引用:
public class 2000314370
{
public All all { get; set; }
}
public class Data
{
public IList<2000314370> 2000314370 { get; set; }
}
我可以声明 classes 并将动态 JSON 反序列化到它,还是我必须使用不同的方法?
将根对象的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}}