如何使用Json.NET为数组中的每个对象使用“root”元素反序列化JSON数组?

时间:2012-01-05 23:43:42

标签: .net json json.net deserialization

我有以下JSON字符串:

[
  { "Person" : { "Name" : "John", "Gender" : "male" } },
  { "Person" : { "Name" : "John", "Gender" : "male" } }
]

(正如您可能注意到的那样,我对数组中的每个对象都有一种“根”元素。没有这个“根”元素,任务变得非常简单。)

我必须将其反序列化为Person类列表:

class Person {
    public string Name { get; set; }
    public string Gender { get; set; }
}
...
List<Person> ListPersons() {
    return JsonConvert.DeserializeObject<List<Person>>(jsonString);
}

是否可以在不创建像PersonResult这样的包装类的情况下使用Json.NET

class PersonResult {
    public Person Person { get; set; }
}
...
List<Person> ListPersons() {
    return JsonConvert.DeserializeObject<List<PersonResult>>(jsonString)
                      .Select(p => p.Person)
                      .ToList();
}

对我来说,完美的解决方案是能够以某种方式明确指定这个“根”(例如通过属性)并且不创建任何包装器,助手等。

1 个答案:

答案 0 :(得分:4)

不幸的是,关于这个问题,你无能为力。这就是JSON格式的样子,并且没有办法解决这个问题。结果,Json.Net“看到”你的字符串或多或少:

  

具有Person属性的对象数组,这是另一个具有NameGender属性的对象

您可以使用自定义ContractResolvers播放一些来强制序列化程序以不同的方式工作......但这是相当多的工作。像你建议的包装类就是如何处理这些问题,我建议坚持下去。