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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:28:06