我们有一个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
对象?
已更新: 请注意,更改代码不是一个选项,因为它是遗留系统的一部分,许多系统都依赖于此库。
答案 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
。
未指定类型的类(即它们只是对象)上的.NET属性照常序列化。当反序列化非类型化属性时,序列化程序无法知道要创建的类型(除非启用了类型名称处理且JSON包含类型名称)。 对于这些无类型属性,Json.NET序列化程序将JSON读入LINQ to JSON对象并将它们设置为属性。将为JSON对象创建JObject,将为JSON数组创建JArray,为原始JSON值创建JValue。
编辑:如果您由于某种原因无法添加泛型类型参数,则还有另一种选择;通过将TypeNameHandling
setting设置为Arrays
或All
(或者甚至可能是Auto
),Json.NET将包含$type
属性(以及{{1}序列化JSON中的数组的属性)因此序列化程序将知道要将其反序列化的类型。这将使您的DTO丢失一些额外的元数据,但至少它是另一种选择。我绝对建议用泛型更新你的对象。从长远来看,这将使您受益。