2017-05-25 113 views
2

我試圖讓一個對象的屬性在json反序列化的情況下返回默認值。Newtonsoft json具有DefaultValueHandling的DeserializeObject不與運行時對象一起工作

我讀過,我可以使用[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]屬性來實現此目的。

public class MyClass { 
     public readonly string Id; 
     [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] 
     public RectangleF Position { get; set; } = new RectangleF(0, 0, 1, 1); 

     [JsonConstructor] 
     public MyClass(string id, RectangleF position) { 
      Id = id; 
      Position = position; 
     } 
    } 

    [Test] 
    public void DeserializeDefaultValue() { 
     var json = JObject.FromObject(new { id = "123" }); 
     var obj = json.ToObject<MyClass>(); 
     Expect(obj.Position, Is.EqualTo(new RectangleF(0, 0, 1, 1))); 
    } 

試驗失敗,與位置總是返回new RectangleF(0, 0, 0, 0)

我不能有一個[DefaultValue]屬性,就像我在很多的例子看,因爲的RectangleF在運行時初始化。

我嘗試了很多事情,例如在構造函數中使用[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)],重載構造函數時使用默認值來定位,但沒有任何效果。

有沒有簡單的東西我失蹤要實現這一目標?

+0

嘗試使用'DefaultValueHandling = DefaultValueHandling.Ignore'.'DefaultValueHandling = DefaultValueHandling.Populate'如果未設置DefaultValue,則使用Type的默認值初始化屬性。 –

+0

你能澄清你的意思嗎? – JSarwer

+0

當您將DefaultValueHandling設置爲DefaultValueHandling.Populate時,Serializer首先查看是否存在該屬性的DefaultValue屬性,如果它不是隻給該屬性賦予默認值。例如,如果該屬性是'int',它會給它'0'。 –

回答

1

所以我修改了你正在做的工作,但是這對你正在努力完成的工作有效。

public class MyClass 
{ 
    public readonly string Id; 
    public RectangleF Position { get; set; } 

    [JsonConstructor] 
    public MyClass(string id, RectangleF? position) 
    { 
     Id = id; 
     Position = position ?? new RectangleF(0, 0, 1, 1); 
    } 
} 

只需添加到這一點,如果你擁有的唯一承包商分配給屬性的任何值,屬性初始化被忽略(總是)。如果你添加一個默認的構造函數(沒有參數),那麼我相信你上面的東西總是有效的。

+0

是的,這是一個Struct –

+0

我在構造函數的params中做了RectangleR Nullable。我很快在代碼中運行它,它確實工作。 –

+0

不用擔心隊友。 –

相關問題