调用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
相关产品推荐
相关产品推荐

