如何解析REST API返回的JSON响应并遍历其中的对象数组
解析C#中REST API返回的JSON数组的方案
1. 先定义和JSON结构匹配的实体类
根据你给出的响应结构,先定义三个类对应JSON的层级:
// 根对象,对应JSON最外层结构 public class RootResponse { public List<ResultItem> result { get; set; } } // result数组的单个元素对象 public class ResultItem { // 因为部分返回项没有这两个字段,所以定义为可空int避免解析报错 public int? maxTry { get; set; } public int? minTry { get; set; } public List<DetailItem> details { get; set; } public List<string> aggr { get; set; } public string zone { get; set; } } // details数组的单个元素对象 public class DetailItem { public string firstName { get; set; } }
注意:你给出的示例JSON存在语法问题(比如"maxTry: 17缺右引号、数组末尾多余逗号),实际API返回的合法JSON才可以正常解析。
2. 选择JSON解析库
你可以任选以下两种常用方案:
- 官方库System.Text.Json:.NET Core 3.0、.NET 5及以上版本自带,无需额外安装
- 第三方库Newtonsoft.Json (Json.NET):兼容性更好,需要提前安装NuGet包
Newtonsoft.Json
3. 解析并遍历数组
System.Text.Json版本解析代码
在你拿到finalResponse的位置添加以下代码:
// 配置解析规则:忽略属性名大小写 var jsonOptions = new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true }; RootResponse parsedData = System.Text.Json.JsonSerializer.Deserialize<RootResponse>(finalResponse, jsonOptions); // 遍历result数组 foreach (var resultItem in parsedData.result) { // 读取基础字段 Console.WriteLine($"当前区域:{resultItem.zone}"); if (resultItem.maxTry.HasValue) { Console.WriteLine($"最大尝试次数:{resultItem.maxTry.Value},最小尝试次数:{resultItem.minTry.Value}"); } // 遍历details子数组(如果存在) if (resultItem.details != null) { foreach (var detail in resultItem.details) { Console.WriteLine($"人员姓名:{detail.firstName}"); } } // 遍历aggr子数组 foreach (var aggrVal in resultItem.aggr) { Console.WriteLine($"聚合值:{aggrVal}"); } }
Newtonsoft.Json版本解析代码
如果用Newtonsoft.Json,解析部分代码替换为:
RootResponse parsedData = Newtonsoft.Json.JsonConvert.DeserializeObject<RootResponse>(finalResponse); // 遍历逻辑和上面完全一致
补充优化建议
你现有代码中使用.Result同步等待异步任务,在UI或者ASP.NET场景下有死锁风险,建议改成异步await写法:
// 优化后的异步请求示例 using (HttpClient httpClient = new HttpClient()) { // 异步等待请求完成,不要用.Result var res = await httpClient.GetAsync(url.ToString()); // 可选:先判断请求是否成功,避免解析错误响应 res.EnsureSuccessStatusCode(); finalResponse = await res.Content.ReadAsStringAsync(); // 后续解析逻辑不变 }
内容的提问来源于stack exchange,提问作者xtc
相关产品推荐
相关产品推荐

