为什么当我用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