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

如何使用Json.net读取JSON文件中的数组?遇空引用错误求助

嘿,我太懂这种卡壳的感觉了——试了好几种方法都没搞定,还碰上空引用错误,简直让人头大!咱们一步步来解决你的问题:

先搞清楚核心问题

你要处理的是一个根节点包含数组的JSON(结构类似{ "the_array": [ ... ] }),现在遇到两个问题:

  1. 运行时出现Object reference not set to an instance of an object空引用错误
  2. 之前尝试输出时只能拿到数组的第一项

问题1:空引用错误的常见原因&解决

这个错误90%的情况是JSON反序列化失败,导致你后续访问数组时拿到的是null。常见的坑有这些:

  • 你的模型类和JSON结构不匹配
  • JSON文件本身格式不完整(你给的示例{ "the_array":[明显没写完,这肯定会解析失败!)
  • 没有做空值检查就直接访问数组

第一步:定义正确的模型类

不管你用System.Text.Json还是Newtonsoft.Json,都需要一个对应JSON结构的类:

// 如果用System.Text.Json,记得加JsonPropertyName映射(如果命名不一致的话)
using System.Text.Json.Serialization;

public class JsonDataModel
{
    [JsonPropertyName("the_array")]
    public List<object> TheArray { get; set; } 
    // 这里的object可以换成你数组元素的实际类型,比如string、自定义类等
}

要是数组里是自定义对象,比如每个元素是{ "name": "xxx", "id": 1 },那就要再定义一个类:

public class ArrayItem
{
    public string Name { get; set; }
    public int Id { get; set; }
}

// 然后模型类改成:
public class JsonDataModel
{
    [JsonPropertyName("the_array")]
    public List<ArrayItem> TheArray { get; set; }
}

第二步:带空检查的解析代码

这里给你用System.Text.Json的完整示例(.NET Core/5+默认自带):

using System;
using System.Text.Json;
using System.IO;

class Program
{
    static void Main()
    {
        try
        {
            // 读取JSON文件
            string jsonContent = File.ReadAllText("your-json-file.json");
            
            // 反序列化到模型类
            var jsonModel = JsonSerializer.Deserialize<JsonDataModel>(jsonContent);
            
            // 关键:先做空值检查!
            if (jsonModel == null)
            {
                Console.WriteLine("JSON解析完全失败,可能是格式错误");
                return;
            }
            if (jsonModel.TheArray == null)
            {
                Console.WriteLine("JSON里的the_array不存在或者为空");
                return;
            }
            
            // 到这里就安全了,可以操作数组了
            Console.WriteLine($"数组一共有{jsonModel.TheArray.Count}个元素:");
            foreach (var item in jsonModel.TheArray)
            {
                Console.WriteLine(JsonSerializer.Serialize(item));
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"出错了:{ex.Message}");
        }
    }
}

如果用Newtonsoft.Json(Json.NET),只需要把反序列化的那行换成:

var jsonModel = JsonConvert.DeserializeObject<JsonDataModel>(jsonContent);

问题2:只能拿到数组第一项的解决

之前你只能拿到第一项,大概率是因为没有遍历整个数组,比如你之前的代码可能只写了Console.WriteLine(jsonModel.TheArray[0]),而没有用foreach循环遍历所有元素。

另外也要确认你的JSON数组里确实有多个元素——如果JSON本身只有一个元素,那自然只能拿到一个啦!

额外的排查小技巧

  1. 先检查JSON格式是否完整有效:可以用VS自带的JSON编辑器打开,或者本地验证一下,确保没有缺括号、逗号之类的错误
  2. 加调试断点:在反序列化之后,查看jsonModel和TheArray的值,确认是否被正确解析
  3. 如果数组元素类型复杂,先简化测试:比如把数组换成纯字符串数组,验证解析逻辑没问题后再换成复杂对象

内容的提问来源于stack exchange,提问作者Tomas Forsman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:35:01