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

本文关键字:illist 集合 填充 NET 何使用 Json | 更新日期: 2023-09-27 18:10:54

我们有一个这样的User类:

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

和这样的Role类:

public class Role
{
    public string Name;
}

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

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

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

您应该在列表中提供一个泛型类型参数,所以是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属性像往常一样被序列化。当非类型化属性被反序列化时,序列化程序无法知道要创建什么类型(除非启用了类型名称处理并且JSON包含类型名称)。对于这些未类型化的属性,Json。. NET序列化器将把JSON读入LINQ to JSON对象,并将它们设置为属性。将为JSON对象创建JObject,为JSON数组创建JArray,为原始JSON值创建JValue。

EDIT:如果由于某种原因不能添加泛型类型参数,还有另一种选择;通过将TypeNameHandling设置为ArraysAll(甚至Auto), Json。NET将在序列化的JSON中包含$type属性(以及数组的$values属性),以便序列化器将知道将其反序列化为哪种类型。这会给您的dto增加一些额外的元数据,但至少这是一种选择。我绝对建议用泛型来更新对象。从长远来看,这对你有好处。