为什么当我用JSON.NET反序列化时忽略我的默认值?
我正在使用JSON.NET作为我的主序列化器。
这是我的模型,看看我已经设置了一些JSONProperties
和一个DefaultValue
。
public class AssignmentContentItem { [JsonProperty("Id")] public string Id { get; set; } [JsonProperty("Qty")] [DefaultValue(1)] public int Quantity { get; set; } }
当我序列化List
,它做得很好:
private static JsonSerializerSettings s = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore };
OUTPUT:
[{"Id":"Q0"},{"Id":"Q4"},{"Id":"Q7"}]
但是当我想反序列化这个jsonContent时,属性Qty始终为0并且未设置为默认值。 我的意思是,当我反序列化jsonContent时,因为Quantity的DefaultValue应该是1而不是0。
public static List DeserializeAssignmentContent(string jsonContent) { return JsonConvert.DeserializeObject<List>(jsonContent, s); }
我该怎么办
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("{\"Id\":\"Q0\"}");
结果在AssignmentContentItem
,其Quantity
设置为1
。
您可以使用DefaultValueHandling.Populate设置,以便Json.Net将使用默认值填充创建的对象。
public static List DeserializeAssignmentContent(string jsonContent) { return JsonConvert.DeserializeObject>(jsonContent, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Populate, NullValueHandling = NullValueHandling.Ignore }); }
http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm