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

如何将伦敦地铁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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:05:43