11

如果我有这样的课程:

[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)
            {
                ...
4

2 回答 2

14

也许添加一个在反序列化结束时检查这个的序列化后回调?

[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>();
    }

但是,在这种情况下,显式 "NeverNull":null在反序列化期间将其更改回null,因此我在上面使用了回调。

于 2012-08-14T06:09:01.843 回答
1

IList<int>with的初始化new int[0]会帮助你!它是给我最好结果的解决方案。

于 2012-08-14T06:32:33.900 回答