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

C# WinForm使用System.Text.Json读取JSON并绑定DataGridView为空问题求助

问题根因

你之前的反序列化目标类型与JSON实际结构不匹配:你的JSON根节点是键值对字典结构,键是运行时间字符串,值是单次运行的记录对象,既不是单个values_advanced对象,也不是数组,所以直接反序列化或转List都会报错。


实现步骤(基于System.Text.Json)

1. 定义数据模型类

// 单次运行记录模型
public class RunRecord
{
    // 额外新增字段,用于存储字典的key(也就是运行时间)
    public string RunTime { get; set; }
    
    [JsonPropertyName("decksize")]
    public int DeckSize { get; set; }
    
    [JsonPropertyName("correctcards")]
    public int CorrectCards { get; set; }
    
    [JsonPropertyName("time2mem")]
    public string TimeToMem { get; set; }
    
    [JsonPropertyName("time2sor")]
    public string TimeToSor { get; set; }
    
    [JsonPropertyName("mempalaces")]
    public List<string> MemPalaces { get; set; }
    
    [JsonPropertyName("troublecards")]
    public List<string> TroubleCards { get; set; }

    // 可选:如果需要在表格中直接显示数组内容,新增两个格式化后的属性
    public string MemPalacesDisplay => MemPalaces != null ? string.Join(",", MemPalaces) : "";
    public string TroubleCardsDisplay => TroubleCards != null ? string.Join(",", TroubleCards) : "";
}

2. 反序列化并转换为可绑定列表

// 读取本地JSON文件内容
string jsonString = File.ReadAllText("你的本地json文件存储路径");

// 第一步:按照字典结构反序列化
var runDict = JsonSerializer.Deserialize<Dictionary<string, RunRecord>>(jsonString);

// 第二步:转换为可绑定的列表结构,同时填充运行时间字段
List<RunRecord> runList = runDict.Select(kv => 
{
    kv.Value.RunTime = kv.Key;
    return kv.Value;
}).ToList();

// 绑定到DataGridView控件
dbHistory.DataSource = runList;

3. 可选:调整DataGridView显示效果

如果不需要显示原始的数组类型属性,可以手动隐藏对应列:

dbHistory.Columns["MemPalaces"].Visible = false;
dbHistory.Columns["TroubleCards"].Visible = false;

完成以上操作后,DataGridView就能正常展示所有字段,和你预期的Excel显示效果一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:57:03