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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:06:00