反序列化使得字段是空列表而不是空

如果我有这样的课程:

[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将帮助你! 它的解决方案给了我最好的结果。