web-dev-qa-db-ja.com

JSON.NETで逆シリアル化すると、デフォルト値が無視されるのはなぜですか?

メインのシリアライザーとしてJSON.NETを使用しています。

これは私のモデルです。いくつかのJSONPropertiesDefaultValueを設定したようです。

public class AssignmentContentItem
{
    [JsonProperty("Id")]
    public string Id { get; set; }
    [JsonProperty("Qty")]
    [DefaultValue(1)]
    public int Quantity { get; set; }
}

List<AssignmentContentItem>をシリアル化すると、うまく機能します。

private static JsonSerializerSettings s = new JsonSerializerSettings
{
    DefaultValueHandling = DefaultValueHandling.Ignore,
    NullValueHandling = NullValueHandling.Ignore
};

出力:

[{"Id":"Q0"},{"Id":"Q4"},{"Id":"Q7"}]

しかし、このjsonContentを逆シリアル化する場合、プロパティQtyは常に0であり、デフォルト値に設定されていません。つまり、そのjsonContentを逆シリアル化すると、QuantityのDefaultValueは0ではなく1になるはずです。

public static List<AssignmentContentItem> DeserializeAssignmentContent(string jsonContent)
{
    return JsonConvert.DeserializeObject<List<AssignmentContentItem>>(jsonContent, s);
}

私は何をすべきか

16
Darf Zon

DefaultValue属性は、プロパティの値を設定しません。この質問を参照してください: 。NET DefaultValue属性

コンストラクターで値を設定する方がよい場合があります。

public class AssignmentContentItem
{
    [JsonProperty("Id")]
    public string Id { get; set; }
    [JsonProperty("Qty")]
    public int Quantity { get; set; }

    public AssignmentContentItem()
    {
        this.Quantity = 1;
    }
}

この行の場所:

AssignmentContentItem item =
    JsonConvert.DeserializeObject<AssignmentContentItem>("{\"Id\":\"Q0\"}");

AssignmentContentItem1に設定されたQuantityになります。

15
nick_w

DefaultValueHandling.Populate設定を使用して、Json.Netが作成されたオブジェクトにデフォルト値を設定することができます。

public static List<AssignmentContentItem> DeserializeAssignmentContent(string jsonContent)
{
    return JsonConvert.DeserializeObject<List<AssignmentContentItem>>(jsonContent, new JsonSerializerSettings
    { 
            DefaultValueHandling = DefaultValueHandling.Populate, 
            NullValueHandling = NullValueHandling.Ignore 
    });
}

http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm

10
Slugart