Json.net 无法加载属于类对象的某些属性?

Posted

技术标签:

【中文标题】Json.net 无法加载属于类对象的某些属性?【英文标题】:Json.net failing to load certain properties belonging to a class object? 【发布时间】:2016-02-15 17:08:13 【问题描述】:

注意:我添加此社区 wiki 条目是为了节省我刚刚调试此问题的时间。

我有一个具有多个公共属性的类对象。我可以使用 JSON.net 很好地序列化它。但是当我加载 JSON 文本并使用 JsonConvert.DeserializeObject<> 对其进行反序列化时,某些字段在序列化时肯定具有有效值时会设置为 NULL。我手动检查了序列化的 JSON 字符串,我肯定在文本中看到了 NULL 属性的值。为什么会这样?

【问题讨论】:

【参考方案1】:

默认情况下,Json.Net 仅对类的公共成员进行序列化和反序列化。如果您的属性有公共 getter 和私有 setter,那么这些属性将被序列化为 JSON,但不会反序列化回您的类。

解决此问题的简单方法是将您的 setter 公开,但这当然会破坏私有 setter 提供的不变性。如果您希望在仍然能够反序列化它们的同时保持 setter 的私密性,您可以使用 [JsonProperty] 属性来注释您的属性。这将允许反序列化器“看到”它们。

这里有一个简短的演示:https://dotnetfiddle.net/4nZdGJ

【讨论】:

【参考方案2】:

虽然我花了一段时间才找到问题,但答案很简单。反序列化时始终具有 NULL 值的对象属性具有私有设置器。我将二传手公开,问题就消失了。

【讨论】:

如果你想让你的setter保持私有,你可以用[JsonProperty]属性注释你的类属性,这将允许反序列化器“看到”它们。 谢谢布赖恩。这是一个很好的提示。如果您将该评论转化为答案,我会将其标记为已接受的答案,因为它比我的要好。

以上是关于Json.net 无法加载属于类对象的某些属性?的主要内容,如果未能解决你的问题,请参考以下文章

使属性反序列化但不使用 json.net 序列化

无法将类型'Newtonsoft.Json.Linq.JObject'的对象转换为类型

无监督学习

课堂笔记0518 static final

static关键字

static关键字