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