我試圖讓一個對象的屬性在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)]
,重載構造函數時使用默認值來定位,但沒有任何效果。
有沒有簡單的東西我失蹤要實現這一目標?
嘗試使用'DefaultValueHandling = DefaultValueHandling.Ignore'.'DefaultValueHandling = DefaultValueHandling.Populate'如果未設置DefaultValue,則使用Type的默認值初始化屬性。 –
你能澄清你的意思嗎? – JSarwer
當您將DefaultValueHandling設置爲DefaultValueHandling.Populate時,Serializer首先查看是否存在該屬性的DefaultValue屬性,如果它不是隻給該屬性賦予默認值。例如,如果該屬性是'int',它會給它'0'。 –