如何使用Json.NET填充IList集合

时间:2014-06-30 15:10:23

标签: c# json json.net

我们有一个User类,如下所示:

public class User
{
    public string Name;
    public IList Roles;
}

Role这样的类:

public class Role
{
    public string Name;
}

当我使用Json.NET序列化然后反序列化User对象时,我得到一个JSON列表而不是Roles。我如何配置Json.NET以正确反序列化User对象?

已更新: 请注意,更改代码不是一个选项,因为它是遗留系统的一部分,许多系统都依赖于此库。

1 个答案:

答案 0 :(得分:7)

您应该在列表中提供泛型类型参数,因此Json.NET了解您需要Role的列表,如下所示:

public class User
{
    public string Name { get; set; }

    public IList<Role> Roles { get; set; }
}

请务必添加using System.Collections.Generic

由于您尚未为IList提供通用类型参数,因此它实际上会变为IList<object>,这反过来又会使Json.NET将其内容视为JObject

来自Json.NET documentation

  

未指定类型的类(即它们只是对象)上的.NET属性照常序列化。当反序列化非类型化属性时,序列化程序无法知道要创建的类型(除非启用了类型名称处理且JSON包含类型名称)。   对于这些无类型属性,Json.NET序列化程序将JSON读入LINQ to JSON对象并将它们设置为属性。将为JSON对象创建JObject,将为JSON数组创建JArray,为原始JSON值创建JValue。

编辑:如果您由于某种原因无法添加泛型类型参数,则还有另一种选择;通过将TypeNameHandling setting设置为ArraysAll(或者甚至可能是Auto),Json.NET将包含$type属性(以及{{1}序列化JSON中的数组的属性)因此序列化程序将知道要将其反序列化的类型。这将使您的DTO丢失一些额外的元数据,但至少它是另一种选择。我绝对建议用泛型更新你的对象。从长远来看,这将使您受益。