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

