如何使用JsonConvert.DeserializeObject忽略空数组?
解决JsonConvert.DeserializeObject空数组反序列化异常的方案
兄弟,我太懂这种踩坑的感觉了——有数据时一切正常,空数组就炸,调了半天设置还是没用。咱们一步步来排查,大概率是这几个原因:
1. 先查最容易踩的坑:类属性类型不匹配
这是90%概率会出现的问题:JSON里的数组字段(哪怕是空的),你的类里对应的属性必须是集合类型,而不是单个对象!
举个反面例子,比如JSON结构是:
{ "items": [] }
但你的类写成了这样:
public class Order { // 错误:这里是单个Item对象,但JSON里是数组,空数组时无法转成单个对象,直接抛异常 public Item Items { get; set; } }
改成集合类型就好:
public class Order { // 正确:用List<T>、T[]或者IEnumerable<T>对应JSON数组 public List<Item> Items { get; set; } // 或者用数组也可以:public Item[] Items { get; set; } }
2. 调整序列化配置到正确姿势
你试过DefaultValueHandling和NullValueHandling,但可能没搭配对关键设置。试试这个配置:
var serializerSettings = new JsonSerializerSettings { // 空数组时自动为集合属性填充默认值(空集合) DefaultValueHandling = DefaultValueHandling.Populate, // 忽略null字段,避免干扰空数组的解析 NullValueHandling = NullValueHandling.Ignore, // 核心设置:告诉Json.NET直接替换属性值,而不是尝试往null的集合里加元素 ObjectCreationHandling = ObjectCreationHandling.Replace }; // 用这个配置反序列化 var resultList = JsonConvert.DeserializeObject<List<YourClass>>(jsonString, serializerSettings);
其中ObjectCreationHandling.Replace是关键,它会让Json.NET在遇到空数组时,直接给属性赋值为空集合,而不是因为属性是null就报错。
3. 给单个属性加特性兜底
如果全局配置没用,直接给有问题的集合属性加特性,同时提前初始化空集合:
public class YourClass { [JsonProperty( NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Populate )] // 提前初始化空集合,从根源避免null导致的问题 public List<YourItem> YourArrayProperty { get; set; } = new List<YourItem>(); }
提前初始化集合的小技巧,能让Json.NET直接把空数组的内容(空)映射到已有的集合里,不会因为属性为null而触发异常。
4. 最后排查JSON格式
虽然你说有数据时正常,但还是确认下空数组的JSON是不是合法的——比如是不是写成了"yourArray": null而不是"yourArray": []?用个JSON校验工具扫一下,确保格式没问题。
一般来说,前面两步就能解决问题,尤其是第一步的类型匹配,很多人都在这里栽过跟头!
内容的提问来源于stack exchange,提问作者Rick Engle
相关产品推荐
相关产品推荐

