使用Newtonsoft JSON在C#中加载JSON数组时出现读取错误
问题分析与解决方案
嘿,这问题太典型了——你的JSON结构和要反序列化的类完全不匹配,所以Json.NET才抛出了这个让人摸不着头脑的错误!
错误根源
你的JSON根对象是一个包含Features数组的容器,但你却直接把整个JSON反序列化为单个FilterMatrix实例。Json.NET解析时,会在根对象里寻找FilterMatrix类定义的ID和ParentID属性,结果它先遇到了Features这个陌生的键,而且对应的值是一个数组,这完全超出了它对FilterMatrix类型的预期,自然就报错了。
修复步骤
你需要创建一个根类来匹配JSON的整体结构,再用这个根类完成反序列化:
- 调整类结构,新增匹配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; } }
- 修改反序列化代码,使用根类解析:
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




