jsonでそのプロパティが存在しない場合にデフォルト値を返すオブジェクトのプロパティを取得しようとしています。逆シリアル化します。Newtonsoft json DeserializeObject with DefaultValueHandlingがランタイムオブジェクトで動作しない
これは[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)));
}
テストはいつも、私は多くの例に見られるようなRectangleFは、実行時に初期化されているので、私は、[DefaultValue]
属性を持つことはできませんnew RectangleF(0, 0, 0, 0)
を返す位置で、失敗します。
コンストラクタに[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
があるなど、多くのことを試みました。コンストラクタにpositionのデフォルト値をオーバーロードしていますが、何も機能しません。
これを達成するために欠けているものがありますか?
DefaultValueHandling = DefaultValueHandling.Ignore'.DefaultValueHandling = DefaultValueHandling.Populate'を使用すると、DefaultValueが設定されていない場合は、そのタイプのデフォルト値でプロパティを初期化してください。 –
あなたは何を意味するか分かりますか? – JSarwer
'DefaultValueHandling'を' DefaultValueHandling.Populate'に設定すると、 'Serializer'は最初に、そのプロパティに' DefaultValue'属性があるかどうかを調べます。たとえば、プロパティが 'int'の場合、' 0'になります。 –