2017-02-15 71 views
1

我有一个构造方法的对象,其将所有属性为默认值,包括一些引用类型值:Json.net解串器忽略非空引用类型属性

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)保持在构造函数中设置的值,但值类型属性(Test1)很好地反序列化。

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

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

我在做什么错?

回答

0

由于从Newtonsoft文档每,

Json.NET解串器使用ObjectCreationHandling.Auto为默认值,如果已经创造了它,它使用现有的对象。

如果您想通过Json.NET创建新的对象本身,你应该在JsonSerializerSettings其中不论对象已创建或不创建新的对象使用ObjectCreationHandling.Replace

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

您的设置应该是:

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

谢谢! Json.net已经尝试重用创建的MyClass对象,但它的所有属性都是只读的,并且必须在构造函数中设置。 – Paboka