如何将伦敦地铁API的JSON数组反序列化为C#对象?
解决伦敦地铁API反序列化的编译错误
嘿,我来帮你搞定这个问题!你遇到的List does not contain a definition for name错误,核心原因是搞混了单个JSON对象和JSON数组的反序列化结果处理方式——咱们一步步来拆解:
错误根源:集合 vs 单个对象
你调用的TFL API返回的是一个JSON数组(开头是[,结尾是]),所以你用JsonConvert.DeserializeObject<List<RootObject>>(stringResult)反序列化是完全正确的,但rawData是一个List<RootObject>类型的集合,不是单个RootObject对象!集合本身没有name属性,直接写rawData.name自然会编译报错。
修正代码:遍历集合提取数据
你需要遍历这个集合里的每一条地铁线路,提取你需要的信息(比如线路名称、运行状态)。这里我给你修改后的GetTubeStatus方法,同时优化了状态的提取逻辑(因为lineStatuses本身也是一个列表,可能包含多条状态):
[HttpGet("[action]")] public async Task<IActionResult> GetTubeStatus() { using (var client = new HttpClient()) { try { client.BaseAddress = new Uri("https://api.tfl.gov.uk"); var response = await client.GetAsync("/Line/Mode/tube/Status"); response.EnsureSuccessStatusCode(); var stringResult = await response.Content.ReadAsStringAsync(); var rawData = JsonConvert.DeserializeObject<List<RootObject>>(stringResult); // 遍历每条线路,提取名称和状态(取第一条状态,你可以根据需求调整) var tubeStatuses = rawData.Select(line => new { LineName = line.name, Status = line.lineStatuses.FirstOrDefault()?.statusSeverityDescription ?? "Unknown" }).ToList(); return Ok(tubeStatuses); } catch (HttpRequestException httpRequestException) { return BadRequest($"Error getting data: {httpRequestException.Message}"); } } }
额外说明:JSON结构匹配验证
你的RootObject和LineStatus类结构是对的,刚好匹配TFL API返回的JSON格式。如果以后遇到类似的JSON反序列化问题,你可以把API返回的JSON字符串粘贴到VS自带的「编辑 > 选择性粘贴 > 将JSON粘贴为类」功能里,自动生成匹配的C#类,避免手动写类时出现属性名或结构不匹配的问题。
内容的提问来源于stack exchange,提问作者user11196706
相关产品推荐
相关产品推荐

