.NET反序列化JSON文件时仅读取单个对象的问题排查
解决JsonTextReader只读取单个JSON对象的问题
嗨,我之前也碰到过一模一样的情况!大概率是你的JSON文件结构没处理对——要么是多个独立的JSON对象没包裹成数组,要么是读取代码没做循环处理,导致JsonTextReader读完第一个对象就停了。给你两种可行的解决方案,看哪种适合你的场景:
方案1:把JSON改成标准数组格式(最省心)
如果能修改JSON文件的结构,直接把所有对象放到一个数组里,比如从:
{ "Id": 1, "Name": "张三" }
{ "Id": 2, "Name": "李四" }
改成:
[
{ "Id": 1, "Name": "张三" },
{ "Id": 2, "Name": "李四" }
]
然后用下面的代码直接反序列化整个数组,绑定到DataGridView就行:
using Newtonsoft.Json; using System.Collections.Generic; using System.IO; using System.Windows.Forms; // 先定义和JSON字段匹配的数据模型 public class UserInfo { public int Id { get; set; } public string Name { get; set; } // 其他字段根据你的JSON内容添加 } // 读取并绑定数据的代码 string jsonPath = @"C:\YourFile.json"; string jsonContent = File.ReadAllText(jsonPath); List<UserInfo> dataList = JsonConvert.DeserializeObject<List<UserInfo>>(jsonContent); yourDataGridView.DataSource = dataList;
方案2:无法修改JSON?循环读取每个对象
如果JSON文件是固定的多个独立对象(比如日志类的每行一个JSON),那就要让JsonTextReader循环读取到文件末尾,代码如下:
using Newtonsoft.Json; using System.Collections.Generic; using System.IO; using System.Windows.Forms; string jsonPath = @"C:\YourFile.json"; List<UserInfo> dataList = new List<UserInfo>(); // 流式读取,省内存还能读全所有对象 using (StreamReader sr = new StreamReader(jsonPath)) using (JsonTextReader reader = new JsonTextReader(sr)) { while (reader.Read()) { // 只处理对象开始的节点,跳过其他无关节点 if (reader.TokenType == JsonToken.StartObject) { UserInfo item = JsonSerializer.Create().Deserialize<UserInfo>(reader); dataList.Add(item); } } } yourDataGridView.DataSource = dataList;
额外注意点
- 确保你的数据模型类(比如上面的
UserInfo)属性名和JSON字段完全一致,不一致的话可以用[JsonProperty("字段名")]特性映射 - 检查JSON有没有语法错误,比如某个对象少了括号、逗号,这会导致读取中断
- 大文件优先用方案2,流式读取不会把整个文件加载到内存里,性能更好
内容的提问来源于stack exchange,提问作者bashamjr
相关产品推荐
相关产品推荐

