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

C#如何将循环获取的JSON响应存入数组 解决仅展示单条数据问题

问题根因

你排查的方向正确,代码一共存在3处会导致数据显示异常的问题:

  • result被定义为单个JsonData类型变量,每次循环都会被最新的反序列化结果覆盖,循环执行完成后仅会保留最后一个请求的返回值,无法存储3个接口的全量数据
  • 所有接口返回的JSON最外层是数组结构(包裹了[]),当前直接反序列化为单个JsonData对象的写法类型不匹配,会抛出序列化错误
  • 调用GetAsync时使用.Result做同步阻塞,容易触发异步上下文死锁,不推荐在Web场景下使用
修复方案

第一步:调整实体类定义

Address是固定字段结构的对象,无需使用Dictionary<string,string>,定义强类型实体即可,后续取值更方便:

public class Address
{
    public string zipcode { get; set; }
    public string town { get; set; }
}

public class JsonData 
{
    public int id { get; set; }
    public string name { get; set; }
    public Address Address { get; set; }
}

第二步:修改循环请求逻辑

在循环外初始化一个列表用来存储所有接口的返回结果,修正异步调用写法和反序列化类型:

// 初始化全量结果集合,用来存储3个接口的所有返回数据
List<JsonData> allResults = new List<JsonData>();
foreach (var url in urls){
  // 移除.Result阻塞写法,全程使用await异步调用
  HttpResponseMessage response = await client.GetAsync(url);
  response.EnsureSuccessStatusCode();

  string body = await response.Content.ReadAsStringAsync();
  // 匹配接口返回的数组结构,反序列化为JsonData集合
  var currentUrlResults = JsonConvert.DeserializeObject<List<JsonData>>(body);
  // 将当前接口返回的数据追加到全量结果集合中
  allResults.AddRange(currentUrlResults);
}

注意:如果使用的是ASP.NET Core Razor页面,需要把allResults作为模型属性传递到视图层。

第三步:修正Razor渲染代码

遍历全量结果集合渲染即可,同时补全原代码中未闭合的<p>标签,避免页面布局错乱:

@foreach(var item in Model.allResults) {
  <p>@item.Address.zipcode - <small>@item.Address.town</small></p>
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:48:31