【发布时间】:2017-02-02 15:49:49
【问题描述】:
在从 JSON.Net 6 迁移到最新版本 (9.0.1) 时,我注意到在反序列化期间如何处理 DefaultValueHandling.Populate 和 IgnoreAndPopulate 的行为发生了变化。在最新版本中,Json 属性在反序列化后被初始化为 null 而不是其默认值。
这是一个重现问题的简单测试:
private class MyTestClass
{
public const string DefaultText = "...";
[DefaultValue(DefaultText)]
[JsonProperty(PropertyName = "myText", DefaultValueHandling = DefaultValueHandling.Populate)]
public readonly string Text;
public MyTestClass(string text = DefaultText)
{
Text = text;
}
}
[Test]
public void DumbTest()
{
MyTestClass myObject = JsonConvert.DeserializeObject<MyTestClass>("{}"); // Fail with version 9.0.1
Assert.AreEqual(MyTestClass.DefaultText, myObject.Text);
}
这是因为构造函数的参数名称与属性名称匹配。因此 Json.net 现在将其视为由构造函数初始化,并且不再应用“默认值处理”规则。这似乎来自图书馆的这次更新:link。
将构造函数的参数名称重命名为与属性名称不匹配可以解决我的问题,但这似乎不是一个干净的解决方案。是否有一些我缺少的配置属性(或更干净的方式)?我需要构造函数,因为我希望能够自己创建对象(而不是从 JSON)。
【问题讨论】:
标签: c# json json.net deserialization json-deserialization