使用Newtonsoft.Json根据Id值查询JSON中对应对象的实现方法
解决方案
实现思路
- 避免每次点击Grid行都重复反序列化JSON,在窗体加载阶段一次性解析并缓存所有Entry数据,提升响应速度
- 点击行时先校验点击的是有效数据行,再提取对应行的Id值
- 用LINQ匹配Id筛选出目标Entry对象,直接传递给目标表单即可
完整修改代码
using System.Linq; // 需先引入LINQ命名空间 public partial class FormulierenOverzicht : Form { // 新增私有字段,缓存所有Entry数据 private List<_013.Entry> _allEntries = new List<_013.Entry>(); public FormulierenOverzicht() { InitializeComponent(); } private void FormulierenOverzicht_Load(object sender, EventArgs e) { var json = Resource._013; // 一次性反序列化完整JSON结构 var root = JsonConvert.DeserializeObject<_013.Rootobject>(json); _allEntries = root.Entries.ToList(); // 原有绑定逻辑不变 var tmpTable = JsonConvert.DeserializeAnonymousType(json, new { Entries = default(DataTable) }).Entries; DataTable dtEntries = tmpTable.DefaultView.ToTable(true, "Id", "CompleteTime"); var dgView = dataGridView1; dgView.DataSource = dtEntries; dgView.Columns["CompleteTime"].DefaultCellStyle.Format = "yyyy-MM-dd"; dgView.Columns["CompleteTime"].HeaderText = "Datum afgerond"; dgView.Sort(dgView.Columns["CompleteTime"], ListSortDirection.Descending); dgView.Columns[0].Visible = false; } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { // 过滤表头点击,只处理数据行点击事件 if (e.RowIndex < 0) return; // 获取选中行的Id值 DataGridViewRow selectedRow = dataGridView1.Rows[e.RowIndex]; string matchIdToFind = selectedRow.Cells["Id"].Value.ToString(); // 用LINQ查询匹配Id的Entry对象,匹配不到会返回null var targetEntry = _allEntries.FirstOrDefault(entry => entry.Id == matchIdToFind); if(targetEntry != null) { // 此处把targetEntry传递给你的目标表单即可,示例逻辑: // 目标表单类 targetForm = new 目标表单类(targetEntry); // targetForm.Show(); } } }
逻辑说明
你已经定义了完整的JSON实体类,所以反序列化后_allEntries里的每个对象都包含了该条目的所有字段,包括嵌套的Answers结构。LINQ的FirstOrDefault方法会直接遍历缓存的Entry列表匹配Id,不需要重复解析JSON文件。如果希望优化性能避免两次反序列化,也可以直接从_allEntries生成绑定用的DataTable,不需要再调用一次DeserializeAnonymousType。
内容的提问来源于stack exchange,提问作者Bjorn Meijer
相关产品推荐
相关产品推荐

