为啥当我使用 JSON.NET 反序列化时会忽略我的默认值?
Posted
技术标签:
【中文标题】为啥当我使用 JSON.NET 反序列化时会忽略我的默认值?【英文标题】:Why when I deserialize with JSON.NET ignores my default value?为什么当我使用 JSON.NET 反序列化时会忽略我的默认值? 【发布时间】:2013-03-05 08:25:03 【问题描述】:我使用 JSON.NET 作为我的主要序列化程序。
这是我的模型,看我设置了一些JSONProperties
和一个DefaultValue
。
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 时,数量的 DefaultValue 应该是 1 而不是 0。
public static List<AssignmentContentItem> DeserializeAssignmentContent(string jsonContent)
return JsonConvert.DeserializeObject<List<AssignmentContentItem>>(jsonContent, s);
我该怎么办
【问题讨论】:
您尝试过 DefaultValueHandling.Populate 设置吗? 【参考方案1】:DefaultValue
属性不设置属性的值。看到这个问题:.NET DefaultValue attribute
你最好在构造函数中设置值:
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\"");
导致AssignmentContentItem
的Quantity
设置为1
。
【讨论】:
如果json没有该属性并且可以为空,则可以添加[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
,因此它将采用构造函数中设置的值,否则将设置为null【参考方案2】:
您可以使用 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
【讨论】:
以上是关于为啥当我使用 JSON.NET 反序列化时会忽略我的默认值?的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 ItemRequired = Required.Always 的 Json.Net 反序列化时忽略属性