我们有这样一个User类:
public class User
{
public string Name;
public IList Roles;
}
Run Code Online (Sandbox Code Playgroud)
和这样的一个Role类:
public class Role
{
public string Name;
}
Run Code Online (Sandbox Code Playgroud)
当我User使用Json.NET 序列化然后反序列化对象时,我得到一个JSON列表而不是Roles.我如何配置Json.NET以User正确反序列化对象?
更新: 请考虑更改代码不是一个选项,因为它是遗留系统的一部分,许多系统都依赖于此库.
您应该在列表中提供泛型类型参数,因此Json.NET了解您需要一个列表Role,如下所示:
public class User
{
public string Name { get; set; }
public IList<Role> Roles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
记得加 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设置为Arrays或All(或甚至可能Auto),Json.NET将在序列化的JSON中包含$type属性(以及$values数组的属性),以便序列化程序知道要将其反序列化的类型.这将使您的DTO丢失一些额外的元数据,但至少它是另一种选择.我绝对建议用泛型更新你的对象.从长远来看,这将使您受益.
| 归档时间: |
|
| 查看次数: |
2030 次 |
| 最近记录: |