栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用.NET Newtonsoft.Json组件反序列化某些有效json时,为什么POCO中的所有集合都为null

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用.NET Newtonsoft.Json组件反序列化某些有效json时,为什么POCO中的所有集合都为null

您的问题是,您要反序列化的属性在对象图中获取并设置了 代理
集合,而不是“真实”集合。这样做违反了Json.NET用于构造和填充返回参考类型对象,集合和词典的属性的算法的实现决策。该算法是:

  1. 它在父类中调用getter以获取要反序列化的属性的当前值。

  2. 如果为null,并且除非使用自定义构造函数,否则它将分配属性的返回类型的实例(使用该类型的

    JsonContract.DefaultCreator
    方法)。

  3. 它调用父级中的setter,以将分配的实例设置回父级中。

  4. 它将继续填充类型的实例。

  5. 实例填充后,它不会将实例再次设置回第二次。

在开始时调用getter可以填充类型的实例(例如使用

JsonConvert.PopulateObject()
),然后递归地填充该类型所引用的其他类型的任何预分配实例。(这就是中的
existingValue
参数的目的
JsonConverter.ReadJson()
。)

但是,以这种方式填充预分配的对象图的能力是有代价的:图中遇到的每个对象必须是 真实
对象,而不是为序列化目的创建的某些代理对象。如果getter返回的对象只是某个代理,则将填充该代理,而不填充“真实”对象-
除非该代理具有某种机制,以将对其数据的更改传递回其始发者。

ObjectCreationHandling =ObjectCreationHandling.Replace
如您所见,更改了该算法,以便对集合进行分配,填充和设置。这是启用代理集合反序列化的一种方法。

作为另一个解决方法,您可以选择序列化和反序列化代理 数组

[JsonIgnore]public List<Media> Images{    get { return new List<Media> { new Media{..}, new Media{..} }; }    set { AddImages(value); }}[JsonProperty("Images")] // Could be privateMedia [] ImagesArray{    get { return Images.ToArray(); }    set { AddImages(value); }}

对于数组,Json.NET(和

XmlSerializer
必须
在完全读取数组之后调用setter,因为在完全读取之前无法知道大小,因此无法分配数组并在完全读取之前将其设置回去。

(您也可以使用代理技巧

ObservableCollection
,但是我不推荐这样做。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373263.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号