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

Json.net failing to load certain properties belonging to a class object?

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

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

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

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

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

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