You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用Newtonsoft JSON在C#中加载JSON数组时出现读取错误

问题分析与解决方案

嘿,这问题太典型了——你的JSON结构和要反序列化的类完全不匹配,所以Json.NET才抛出了这个让人摸不着头脑的错误!

错误根源

你的JSON根对象是一个包含Features数组的容器,但你却直接把整个JSON反序列化为单个FilterMatrix实例。Json.NET解析时,会在根对象里寻找FilterMatrix类定义的IDParentID属性,结果它先遇到了Features这个陌生的键,而且对应的值是一个数组,这完全超出了它对FilterMatrix类型的预期,自然就报错了。

修复步骤

你需要创建一个根类来匹配JSON的整体结构,再用这个根类完成反序列化:

  1. 调整类结构,新增匹配JSON顶层结构的根类:
// 保留你原有的FilterMatrix类不变
public class FilterMatrix 
{ 
    public int ID { get; set; } 
    public int ParentID { get; set; } 
}

// 新增根类,对应JSON的顶层容器
public class FilterMatrixRoot
{
    public List<FilterMatrix> Features { get; set; }
}
  1. 修改反序列化代码,使用根类解析:
string fileName = @"C:\Users\accounts.json";
var rootObject = JsonConvert.DeserializeObject<FilterMatrixRoot>(File.ReadAllText(fileName));

// 现在可以正常访问所有FilterMatrix实例了
foreach (var matrix in rootObject.Features)
{
    Console.WriteLine($"ID: {matrix.ID}, ParentID: {matrix.ParentID}");
}

替代方案(无需新增根类)

如果不想额外定义根类,也可以直接把JSON反序列化为字典类型(但这种方式类型安全性较差):

var result = JsonConvert.DeserializeObject<Dictionary<string, List<FilterMatrix>>>(File.ReadAllText(fileName));
List<FilterMatrix> features = result["Features"];

这样修改后,Json.NET就能正确识别JSON结构,把数组里的每个元素都反序列化为FilterMatrix实例了。

内容的提问来源于stack exchange,提问作者Victor Stoddard

火山引擎 最新活动