如何使用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理解您想要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
设置为Arrays
或All
(甚至Auto
), Json。NET将在序列化的JSON中包含$type
属性(以及数组的$values
属性),以便序列化器将知道将其反序列化为哪种类型。这会给您的dto增加一些额外的元数据,但至少这是一种选择。我绝对建议用泛型来更新对象。从长远来看,这对你有好处。