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

JSON数据无法在DataGridView显示,求调试异步GET加载银行数据代码

问题排查与代码修正

Let's break down the issues in your code step by step and fix them — there are several key problems preventing your bank data from showing up in the DataGridView:

主要问题分析

  • 混合异步与阻塞调用:你在异步方法里用了.Result来同步等待ReadAsAsync的结果,这不仅违背了async/await的最佳实践,还可能导致线程死锁,尤其是在WinForms这类UI框架中。
  • 未定义的变量与类型错误:代码里突然出现的resultString没有赋值来源,而且JsonConvert.DeserializeObject<result>(...)中的result不是一个合法的类型——DataGridView需要强类型集合才能识别并渲染列,不能直接用object。
  • HttpClient资源泄漏:HttpClient实现了IDisposable接口,不用using包裹会导致资源无法及时释放。
  • 错误处理缺失:当请求失败时,result变量未初始化,后续代码会直接报错。
  • UI线程安全问题:异步操作可能在后台线程完成,WinForms控件必须在UI线程更新,直接赋值会引发跨线程异常。

修正后的完整代码

首先,你需要定义一个与JSON数据结构匹配的实体类(示例根据常见银行数据结构编写,你需要根据实际JSON字段调整):

public class Bank
{
    // 用JsonPropertyAttribute匹配JSON字段(如果字段名大小写/命名规则不一致)
    [JsonProperty("bank_id")]
    public int Id { get; set; }
    
    [JsonProperty("bank_name")]
    public string Name { get; set; }
    
    [JsonProperty("branch_location")]
    public string Branch { get; set; }
    
    // 其他对应JSON的属性...
}

然后是修正后的异步加载方法:

private async Task LoadBankDataAsync(string path)
{
    // 使用using确保HttpClient被正确释放
    using (HttpClient client = new HttpClient())
    {
        try
        {
            HttpResponseMessage response = await client.GetAsync(path);
            // 强制检查响应状态,失败则抛出异常
            response.EnsureSuccessStatusCode();
            
            // 异步读取JSON字符串
            string jsonContent = await response.Content.ReadAsStringAsync();
            
            // 反序列化为强类型集合
            List<Bank> bankList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Bank>>(jsonContent);
            
            // 确保在UI线程更新DataGridView
            if (dataGridViewBank.InvokeRequired)
            {
                dataGridViewBank.Invoke(new Action(() => 
                {
                    dataGridViewBank.DataSource = bankList;
                }));
            }
            else
            {
                dataGridViewBank.DataSource = bankList;
            }
        }
        catch (HttpRequestException ex)
        {
            // 处理网络请求错误
            MessageBox.Show($"加载银行数据失败:{ex.Message}");
        }
        catch (JsonException ex)
        {
            // 处理JSON解析错误
            MessageBox.Show($"数据格式错误:{ex.Message}");
        }
    }
}

额外注意事项

  • 如果你的JSON返回的是包含数组的嵌套对象(比如{ "data": [/*银行列表*/] }),需要再定义一个根类:
    public class BankResponse
    {
        public List<Bank> Data { get; set; }
    }
    
    反序列化时改为var response = JsonConvert.DeserializeObject<BankResponse>(jsonContent);,然后绑定response.Data到DataSource。
  • 确保实体类的属性与JSON字段完全匹配,大小写敏感,或者用JsonProperty特性做映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:38:04