在JSON.NET中反序列化具有不同名称的对象列表

时间:2017-09-22 00:22:14

标签: c# json json.net deserialization

我从一个返回.json格式的网站获取数据,这种格式对我来说非常陌生。我一直在寻找解决方案几个小时,我必须使用术语。

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层次结构中其他位置的属性名称是已知的。

1 个答案:

答案 0 :(得分:5)

假设在编译时只有名称"Foo""Bar"是未知的,您可以将该JSON反序列化为List<Dictionary<string, RootObject>>,其中RootObject是ac#model I generated自动使用JSON中的http://json2csharp.com/获取"Foo"的值。

型号:

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