You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:21:09