在JSON.NET中反序列化具有不同名称的对象列表
我从一个网站获取我的数据,该网站返回了对我而言很陌生的.json格式。我一直在寻找解决方案几个小时,我必须使用术语。在JSON.NET中反序列化具有不同名称的对象列表
的JSON的格式是这样的:
[
{
"Foo": {
"name": "Foo",
"size": {
"human": "832.73kB",
"bytes": 852718
},
"date": {
"human": "September 18, 2017",
"epoch": 1505776741
},
}
},
{
"bar": {
"name": "bar",
"size": {
"human": "4.02MB",
"bytes": 4212456
},
"date": {
"human": "September 18, 2017",
"epoch": 1505776741
}
}
}]
我使用Newtonsoft的JSON.NET,我似乎无法能够创建一个数据结构,可以让我反序列化,因为它是具有不同名称的类的数组。具体来说,属性名称"Foo"
和"bar"
可能在运行时有所不同。 JSON层次结构中其他位置的属性名称是已知的。
假设只有名字"Foo"
和"Bar"
是在编译时未知的,你可以反序列化JSON为List<Dictionary<string, RootObject>>
,其中RootObject
我是自动生成的使用http://json2csharp.com/从JSON为"Foo"
值一个C#模型。
型号:
public class Size
{
public string human { get; set; }
public int bytes { get; set; }
}
public class Date
{
public string human { get; set; }
public int epoch { get; set; }
}
public class RootObject
{
public string name { get; set; }
public Size size { get; set; }
public Date date { get; set; }
}
反序列化代码:
var list = JsonConvert.DeserializeObject<List<Dictionary<string, RootObject>>>(jsonString);
注:
最外面的类型必须是可枚举这样
List<T>
由于最外层的JSON容器是一个数组 - - 由[
包围的逗号分隔值序列和]
。请参阅Serialization Guide: IEnumerable, Lists, and Arrays。当一个JSON对象可以具有任意属性名称,但是对于属性值具有固定模式时,它可以被反序列化为
Dictionary<string, T>
以获得合适的T
。见Deserialize a Dictionary。可能
bytes
和epoch
应该是long
类型。
工作.Net fiddle。
我多么愚蠢,我试过Dictionary
哪些名称可能会有所不同? '“Foo”'和'“Bar”'? – dbc
是的,这是对的,没有别的 –