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

5

我将从一个返回 .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层次结构中其他属性名称已知。


哪些名称可能会变化?“Foo”和“Bar”吗? - dbc
是的,没错,仅此而已。 - Tamás Török
1个回答

8
假设在编译时只有名称为“Foo”和“Bar”的变量未知,您可以将该JSON反序列化为List<Dictionary<string,RootObject>>,其中RootObject是我使用http://json2csharp.com/从“Foo”的值的JSON自动生成的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 和 Arrays

  • 当 JSON 对象可以具有任意属性名称但对于属性值具有固定模式时,它可以反序列化为适当的 TDictionary<string, T>。请参见 Deserialize a Dictionary

  • 可能应将 bytesepoch 设置为 long 类型。

.Net fiddle 上进行测试。


我真傻,我尝试过Dictionary<string,RootObject>,但没有尝试过List<Dictionary<string,RootObject>>。你刚刚救了我一命! - Tamás Török

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接