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

C# Json.NET反序列化JSON访问Result列表报空引用异常排查

问题排查与修复

你可以正常获取count属性值,说明反序列化流程没有出现整体语法错误,抛出System.NullReferenceException的直接原因是访问warehouseInformation.result时该属性为null,未成功映射JSON中的列表数据,常见诱因如下:

  • 字段映射不匹配:如果JSON根节点存储列表的字段名是大写开头的Result、带复数后缀的results,或是你使用了区分大小写的序列化配置,就会导致列表字段匹配失败,属性保持默认null值;另外如果你的Result类和其他引用库中的同名类冲突,也会导致类型映射错误。
  • 类型不兼容:如果JSON数组内的id/status字段存在嵌套对象、非法格式值,会导致列表项反序列化失败,最终返回null。
  • 值类型默认值误导:int是值类型,反序列化失败时会默认返回0,如果你拿到的count值和JSON中实际存储的count值不一致,说明JSON实际结构和你定义的实体类不匹配(比如count、result字段实际在嵌套的子对象中),并非只有result字段映射失败。
  • 原始JSON截断:读取JSON文件/接口响应时如果内容被截断,刚好丢失result字段的后半段内容,会出现仅能解析到靠前的count字段、后续字段解析失败的情况。

修复方案
  1. 调整实体类定义,显式指定JSON字段映射关系,初始化列表属性从根源避免空引用,同时修改内部类名避免重名冲突:
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;

// 原类名Result易和其他库的同名类冲突,重命名为业务相关名称
public class WarehouseResult
{
    [JsonProperty("id")]
    public string Id { get; set; }
    
    [JsonProperty("status")]
    public string Status { get; set; }
}

public class WarehouseInformation
{
    [JsonProperty("count")]
    public int Count { get; set; }
    
    // 初始化空列表,即使映射失败也不会返回null
    // 如果实际JSON的列表字段名是Result/results,修改JsonProperty内的字符串为对应字段名即可
    [JsonProperty("result")]
    public List<WarehouseResult> Result { get; set; } = new List<WarehouseResult>();
}
  1. 调整反序列化逻辑,增加判空校验和调试日志,方便定位具体问题:
Console.WriteLine("orderdatatoarray");
// 调试时可取消下一行注释,打印完整原始JSON确认结构完整、字段存在
// Console.WriteLine(orderData);

WarehouseInformation warehouseInformation = JsonConvert.DeserializeObject<WarehouseInformation>(orderData);

if (warehouseInformation != null)
{
    Console.WriteLine($"解析到count值:{warehouseInformation.Count}");
    // 先校验列表是否有数据再访问
    if (warehouseInformation.Result.Any())
    {
        var firstItemId = warehouseInformation.Result.First().Id;
        Console.WriteLine($"解析到第一条数据id:{firstItemId}");
        // 在此处编写列表处理逻辑
    }
    else
    {
        Console.WriteLine("未解析到Result列表数据,请检查JSON结构与字段映射配置");
    }

    string[] orderStringArr = new string[0];
    return orderStringArr;
}
else
{
    string[] orderStringArr = new string[0];
    return orderStringArr;
}

调试优先确认原始JSON字符串的结构:确认根节点下的列表字段名、数组内字段和实体类配置一致,不存在多一层嵌套的包装对象。如果JSON实际结构是外层多了包装节点(比如常见的data节点包裹count和result),只需要对应调整实体类的层级关系即可。

内容的提问来源于stack exchange,提问作者Asa Herrin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:09:59