2017-05-25 8 views
2

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のデフォルト値をオーバーロードしていますが、何も機能しません。

これを達成するために欠けているものがありますか?

+0

DefaultValueHandling = DefaultValueHandling.Ignore'.DefaultValueHandling = DefaultValueHandling.Populate'を使用すると、DefaultValueが設定されていない場合は、そのタイプのデフォルト値でプロパティを初期化してください。 –

+0

あなたは何を意味するか分かりますか? – JSarwer

+0

'DefaultValueHandling'を' DefaultValueHandling.Populate'に設定すると、 'Serializer'は最初に、そのプロパティに' DefaultValue'属性があるかどうかを調べます。たとえば、プロパティが 'int'の場合、' 0'になります。 –

答えて

1

私はあなたがやっていたことを少し修正しましたが、これはあなたが達成しようとしていることに対して機能します。

ただ、契約者がプロパティに任意の値を割り当てた場合、プロパティの初期化子は無視されます(常に)。デフォルトのコンストラクタ(paramsを持たない)を追加すると、上記のことが常にうまくいくと思います。

+0

はい、それは構造体です –

+0

コンストラクタのparamsでRectangleR Nullableを作成しました。私はすぐにこれをコードで実行し、うまくいった。 –

+0

心配しないでください。 –

関連する問題