2017-09-22 59 views
4

我从一个网站获取我的数据,该网站返回了对我而言很陌生的.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层次结构中其他位置的属性名称是已知的。

+0

哪些名称可能会有所不同? '“Foo”'和'“Bar”'? – dbc

+0

是的,这是对的,没有别的 –

回答

5

假设只有名字"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

  • 可能bytesepoch应该是long类型。

工作.Net fiddle

+0

我多么愚蠢,我试过Dictionary ,但没有List >。你刚刚救了一天! –

相关问题