JSON反序列化返回Null:无法获取TeamStatistics中的首发球员数据
解决C#反序列化JSON时TeamStatistics为Null的问题
问题根源
你调用的API返回的JSON结构是比赛对象数组,每个比赛对象里嵌套了home_team_statistics和away_team_statistics两个字段(对应两队的统计数据),而非直接返回TeamStatistics数组,也不是GameStats数组中直接包含TeamStatistics字段。quicktype生成的实体类大概率没正确匹配这个嵌套结构,导致反序列化失败。
具体解决步骤
1. 修正实体类结构
根据API返回的JSON结构,重新生成或调整实体类:
- 根实体类(命名为
MatchStats)需包含对应两队统计的属性,用特性映射JSON字段名:using Newtonsoft.Json; // 或System.Text.Json的JsonPropertyName public class MatchStats { [JsonProperty("home_team_statistics")] public TeamStatistics HomeTeamStatistics { get; set; } [JsonProperty("away_team_statistics")] public TeamStatistics AwayTeamStatistics { get; set; } // 可添加其他匹配的比赛属性,比如match_id、date等 } public class TeamStatistics { [JsonProperty("starting_eleven")] public List<Player> StartingEleven { get; set; } // 其他统计属性,如team_name、goals等 } public class Player { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("position")] public string Position { get; set; } // 球员其他属性,如shirt_number等 } - 如果使用
System.Text.Json,把JsonProperty替换为JsonPropertyName即可。
2. 修正反序列化代码
将JSON反序列化为List<MatchStats>,而非之前的List<TeamStatistics>或List<GameStats>:
// 假设jsonContent是从API获取到的字符串 var matchStats = JsonConvert.DeserializeObject<List<MatchStats>>(jsonContent); // 遍历获取所有比赛的首发球员 foreach (var match in matchStats) { // 主队首发 var homeStarters = match.HomeTeamStatistics?.StartingEleven; if (homeStarters != null) { foreach (var player in homeStarters) { Console.WriteLine($"主队首发:{player.Name} - {player.Position}"); } } // 客队首发 var awayStarters = match.AwayTeamStatistics?.StartingEleven; if (awayStarters != null) { foreach (var player in awayStarters) { Console.WriteLine($"客队首发:{player.Name} - {player.Position}"); } } }
3. 排查额外问题
- 确认API返回的JSON中,
home_team_statistics/away_team_statistics字段是否真的有值:部分比赛可能没有统计数据,会返回null,可先输出原始JSON片段验证。 - 如果使用
System.Text.Json,需开启大小写不敏感匹配:var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var matchStats = JsonSerializer.Deserialize<List<MatchStats>>(jsonContent, options); - 重新用quicktype生成类时,务必粘贴完整的API返回JSON片段,让工具正确识别嵌套层级。
内容的提问来源于stack exchange,提问作者Orlak333
相关产品推荐
相关产品推荐

