【问题标题】:Deserializing a list of objects with different names in JSON.NET在 JSON.NET 中反序列化具有不同名称的对象列表
【发布时间】:2017-09-22 00:22:14
【问题描述】:

我从一个网站获取我的数据,该网站返回我非常陌生的 .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"?
  • 是的,没错,没有别的

标签: c# json json.net deserialization


【解决方案1】:

假设在编译时只有名称 "Foo""Bar" 是未知的,您可以将该 JSON 反序列化为 List<Dictionary<string, RootObject>>,其中 RootObject 是我使用来自 JSON 的 http://json2csharp.com/ 自动生成的 ac# 模型"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&lt;T&gt;,因为最外层的 JSON 容器是一个数组——由[] 包围的以逗号分隔的值序列。见Serialization Guide: IEnumerable, Lists, and Arrays

  • 当 JSON 对象可以具有任意属性名称但属性值的架构是固定的时,可以将其反序列化为 Dictionary&lt;string, T&gt; 以获得适当的 T。见Deserialize a Dictionary

  • 可能bytesepoch 应该是long 类型。

工作.Net fiddle

【讨论】:

  • 我太傻了,我尝试了 Dictionary,但没有尝试 List>。您刚刚拯救了这一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多