Json.net反序列化器忽略非null引用类型属性

时间:2017-02-15 05:46:16

标签: c# json serialization

我有一个带有构造函数的对象,它将所有属性设置为默认值,包括一些引用类型值:

class MySettings
{
    public int Test1 { get; set; }  // works well
    public MyClass Test2 { get; set; }  // stays at the default value

    public MySettings()
    {
        this.Test1 = 123;
        this.Test2 = new MyClass(1);
    }
}

当我尝试反序列化一个对象时,引用类型属性(Test2)保持在构造函数中设置的值,但value-type属性(Test1)反序列化很好。 / p>

_jsonSerializationSettings =
    new JsonSerializerSettings
    {
        Formatting = Formatting.Indented,
    };
var result = JsonConvert.DeserializeObject<MySettings>(jsonString, _jsonSerializationSettings);

如果我在构造函数中评论Test2属性的设置,它也会很好地反序列化。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

根据Newtonsoft的文档,

Json.NET反序列化器使用ObjectCreationHandling.Auto作为默认值,如果已经创建了它,则使用现有对象。

如果您想通过Json.NET本身创建新对象,则应在ObjectCreationHandling.Replace中使用JsonSerializerSettings创建新对象,而不管是否已创建对象。

您可以在ObjectCreationHandling中设置JsonSerializerSettings设置,您可以在反序列化中使用该设置。

您的设置应为:

_jsonSerializationSettings =
    new JsonSerializerSettings
    {
        Formatting = Formatting.Indented,
        ObjectCreationHandling = ObjectCreationHandling.Replace
    };