反序列化使得字段是空列表而不是空
如果我有这样的课程:
[DataContract(Name = "", Namespace = "")] public class MyDataObject { [DataMember(Name = "NeverNull")] public IList MyInts { get; set; } }
当下列字符串被反序列化时,有没有办法让MyInts字段成为非空的空列表?
string serialized = @"{""NeverNull"":null}"; MyDataObject myDataObject = JsonConvert.DeserializeObject(serialized);
我正在使用Newtonsoft.Json
我问的原因是我有一个相当复杂的json请求解析,它包含对象列表的嵌套,我想要反序列化代码来创建这些对象,所以我可以避免大量的空检查:
if (foo.bar != null) { foreach (var bar in foo.bar) { if (bar.baz != null) { foreach (var baz in bar.baz) { ...
也许添加一个序列化后回调函数,在反序列化结束时检查它?
[DataContract(Name = "", Namespace = "")] public class MyDataObject { [OnDeserialized] public void OnDeserialized(StreamingContext context) { if (MyInts == null) MyInts = new List(); } [DataMember(Name = "NeverNull")] public IList MyInts { get; set; } }
另请注意, JsonConvert
(与DataContractSerializer
不同)执行默认构造函数,因此通常您也可以添加一个默认构造函数:
public MyDataObject() { MyInts = new List(); }
但是,在这种情况下, 显式 "NeverNull":null
null
在反序列化期间将其更改回null
,因此我之所以使用上面的回调。
用new int[0]
初始化IList
将帮助你! 它的解决方案给了我最好的结果。