C#遍历非统一结构动态JSON遇阻,求指导提取日期字段
问题根源
你当前的遍历层级错误:代码里遍历的是results.items,但这个数组里的每个元素内部还有一个名为item的子数组,真正存储date1和date2的是这个子数组,所以直接访问item.date1自然找不到对应字段。
修正方案
方案1:调整Dynamic遍历逻辑
直接补充嵌套遍历,先遍历外层items,再遍历内层item数组:
using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "myToken"); httpClient.BaseAddress = new Uri("https://app.website.com/data/"); HttpResponseMessage response = httpClient.GetAsync("getData.json?item=myItem").Result; response.EnsureSuccessStatusCode(); dynamic result = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result); foreach (var outerItem in result.results.items) { // 遍历内层存储日期的item数组 foreach (var dateEntry in outerItem.item) { Console.WriteLine($"date1: {dateEntry.date1}, date2: {dateEntry.date2}"); } } }
方案2:使用强类型模型(推荐生产环境)
用C#类映射JSON结构,避免dynamic的类型风险,编译期就能发现错误:
定义模型类
public class RootResponse { public ResultsContainer results { get; set; } } public class ResultsContainer { public List<OuterItem> items { get; set; } } public class OuterItem { public List<DateEntry> item { get; set; } } public class DateEntry { public string date1 { get; set; } public string date2 { get; set; } }
解析并提取数据
using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "myToken"); httpClient.BaseAddress = new Uri("https://app.website.com/data/"); HttpResponseMessage response = httpClient.GetAsync("getData.json?item=myItem").Result; response.EnsureSuccessStatusCode(); string json = response.Content.ReadAsStringAsync().Result; RootResponse root = JsonConvert.DeserializeObject<RootResponse>(json); foreach (var outerItem in root.results.items) { foreach (var dateEntry in outerItem.item) { Console.WriteLine($"date1: {dateEntry.date1}, date2: {dateEntry.date2}"); } } }
额外注意
你提供的JSON示例存在格式错误(比如对象末尾多余的逗号),如果实际请求返回的JSON也有这类问题,需要先修复,否则JsonConvert会解析失败。
内容的提问来源于stack exchange,提问作者eek
相关产品推荐
相关产品推荐

