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

调用Ergast API获取F1赛事结果,C#控制台无法打印车手姓名

问题描述

通过端点http://ergast.com/api/f1/current/last/results.json获取F1最新比赛结果时,Postman发起GET请求可正常获取数据,但自研C#代码运行后控制台仅输出标题,无法打印车手的GivenName和FamilyName,相关代码如下:

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

namespace Software_Test
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 短信发送相关信息
            string apiKey = "//";
            string sender = "//";
            string receiver = "//";

            // 创建HTTP客户端用于获取F1赛事数据
            HttpClient f1Client = new HttpClient();

            // 从Ergast API获取最新F1比赛结果
            string ergastApiUrl = "http://ergast.com/api/f1/current/last/results.json";
            var f1Response = await f1Client.GetAsync(ergastApiUrl);

            // 检查Ergast API的响应状态
            if (f1Response.IsSuccessStatusCode)
            {
                // 读取Ergast API的JSON响应内容
                var f1Result = await f1Response.Content.ReadAsStringAsync();
                // 从JSON响应中提取前三车手的名、姓及排名
                var raceResults = ParseRaceResultsFromJson(f1Result);

                // 打印前三车手的信息
                Console.WriteLine("以下是最新F1比赛结果:");
                for (int i = 0; i < Math.Min(3, raceResults.Count); i++)
                {
                    string driverName = $"{raceResults[i].GivenName} {raceResults[i].FamilyName}";
                    string position = $"{i + 1}";

                    Console.WriteLine($"{position}. {driverName}");
                }
            }
            else
            {
                Console.WriteLine("从Ergast API获取F1赛事数据失败。");
            }
        }

        static List<RaceResult> ParseRaceResultsFromJson(string json)
        {
            List<RaceResult> raceResults = new List<RaceResult>();

            // 将JSON响应反序列化为模型类
            var jsonObject = JsonSerializer.Deserialize<RootObject>(json);

            var results = jsonObject.MRData.RaceTable.Races[0].Results;

            foreach (var result in results)
            {
                raceResults.Add(new RaceResult
                {
                    GivenName = result.Driver.GivenName,
                    FamilyName = result.Driver.FamilyName,
                    Result = result.Position
                });
            }

            return raceResults;
        }
    }

    // 存储比赛结果的模型类
    public class RaceResult
    {
        public string GivenName { get; set; }
        public string FamilyName { get; set; }
        public string Result { get; set; }
    }

    // 用于JSON反序列化的模型类
    public class RootObject
    {
        public MRData MRData { get; set; }
    }

    public class MRData
    {
        public RaceTable RaceTable { get; set; }
    }

    public class RaceTable
    {
        public List<Race> Races { get; set; }
    }

    public class Race
    {
        public List<Result> Results { get; set; }
    }

    public class Result
    {
        public Driver Driver { get; set; }
        public string Position { get; set; }
    }

    public class Driver
    {
        public string GivenName { get; set; }
        public string FamilyName { get; set; }
    }
}
问题根源

System.Text.Json默认区分大小写,而Ergast API返回的JSON字段采用驼峰命名(如givenName、familyName),但代码中C#模型类属性使用帕斯卡命名(如GivenName、FamilyName),导致反序列化时字段匹配失败,属性值为null,最终控制台打印空值。

解决方案

有两种可行修复方式:

方式1:给模型属性添加JsonPropertyName特性

直接在模型类的属性上标注对应JSON字段的名称,确保反序列化匹配正确:

// 用于JSON反序列化的模型类
public class RootObject
{
    public MRData MRData { get; set; }
}

public class MRData
{
    public RaceTable RaceTable { get; set; }
}

public class RaceTable
{
    public List<Race> Races { get; set; }
}

public class Race
{
    public List<Result> Results { get; set; }
}

public class Result
{
    [JsonPropertyName("Driver")]
    public Driver Driver { get; set; }
    [JsonPropertyName("position")]
    public string Position { get; set; }
}

public class Driver
{
    [JsonPropertyName("givenName")]
    public string GivenName { get; set; }
    [JsonPropertyName("familyName")]
    public string FamilyName { get; set; }
}

方式2:配置JsonSerializerOptions开启不区分大小写反序列化

在反序列化时传入配置选项,让System.Text.Json忽略大小写匹配:

static List<RaceResult> ParseRaceResultsFromJson(string json)
{
    List<RaceResult> raceResults = new List<RaceResult>();

    // 配置反序列化选项:忽略大小写
    var options = new JsonSerializerOptions
    {
        PropertyNameCaseInsensitive = true
    };

    // 将JSON响应反序列化为模型类
    var jsonObject = JsonSerializer.Deserialize<RootObject>(json, options);

    var results = jsonObject.MRData.RaceTable.Races[0].Results;

    foreach (var result in results)
    {
        raceResults.Add(new RaceResult
        {
            GivenName = result.Driver.GivenName,
            FamilyName = result.Driver.FamilyName,
            Result = result.Position
        });
    }

    return raceResults;
}
验证效果

修复后重新运行代码,控制台将正确输出前三车手的姓名和排名。


内容的提问来源于stack exchange,提问作者Youritj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:50:22