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
相关产品推荐
相关产品推荐

