c#反序列化json以在json为空时将结果列为null?

时间:2014-11-17 05:38:05

标签: c# json linq

我正面对这种情况,对我来说真的很奇怪。

我有A班有以下

public class A
{
   public A()
   {   
      Values = new List<B>();
   }

   public virtual IList<B> Values { get; set; }
}

我有一个方法可以从db中读取所有A记录。

var all = await GetAll();

这是我的方法

public async Task<IList<A>> GetAll(int id1)
{
    var parameters = new[]
    {
        new SqlParameter("@ProductTypeId", SqlDbType.Int) {Value = id1},  
    };

    return (await _sqlCommandWrapper.ExecuteReaderAsync("SPName", r => new  A
        {
            values = JsonConvert.DeserializeObject<IList<B>>(r["Values"].ToString())
        }, parameters)).ToList();
}

我的db列r["Values"]将返回可以反序列化为B类列表的json。

然后我使用linq来查询我的所有A:

var subitems = all .Where(a=> a.Values .Count > 0).ToList();

如果我的r["Values"]返回数据,则可以正常工作。

但如果不是,那么a.Values为空?

无论如何,我在我的A构造函数中定义了Values = new List<B>();

1 个答案:

答案 0 :(得分:1)

问题的原因是,在执行Json反序列化的代码替换类型(IList<B>)的值之后,您没有对在构造函数中实例化的原始列表执行任何操作

values = JsonConvert.DeserializeObject<IList<B>>(r["Values"].ToString())

r["Values"].ToString()是一个有效的Json时,它被反序列化为IList<B>,这是一个赋值调用,现在当r["Values"].ToString()生成一个不匹配的Json或为空时,结果如下代码是空的

JsonConvert.DeserializeObject<IList<B>>(r["Values"].ToString())

如果您打算使用在构造函数中实例化的List,那么它应该是:

Values.Add(JsonConvert.DeserializeObject<B>(r["Values"].ToString()))

在这种情况下,r["Values"].ToString()为类型B而不是IList<B>生成Json

然而,这肯定不会起作用,因为你正在生成一个新的A,然后将其添加到IList<A>并作为Task结果返回,因此该部分也需要修改