.NET如何将Steam API的JSON响应绑定到Model并返回JSON?
问题根源与解决方案
核心问题
你自动生成的Root类用了固定的游戏ID(_249130)作为属性名,但Steam API返回的JSON根节点是动态的游戏ID(即你传入的SteamGameId参数),固定命名的属性无法匹配动态键,导致反序列化后实例为null。另外调试时看到的反斜杠多为字符串的显示效果,并非实际需要处理的问题。
修正步骤
1. 重构Model类结构
删除自动生成的_249130和原Root类,改用字典接收动态根节点,同时定义通用的游戏详情类:
// 对应Steam返回的success和data结构 public class SteamAppResponse { [JsonPropertyName("success")] public bool Success { get; set; } [JsonPropertyName("data")] public GameData Data { get; set; } } // 对应Steam返回的data字段下的游戏信息 public class GameData { [JsonPropertyName("type")] public string Type { get; set; } [JsonPropertyName("name")] public string Name { get; set; } [JsonPropertyName("steam_appid")] public int SteamAppId { get; set; } [JsonPropertyName("required_age")] public int RequiredAge { get; set; } [JsonPropertyName("is_free")] public bool IsFree { get; set; } [JsonPropertyName("controller_support")] public string ControllerSupport { get; set; } [JsonPropertyName("dlc")] public List<int> Dlc { get; set; } // 根据需求添加其他字段 }
2. 修改后端端点代码
将反序列化目标改为Dictionary<string, SteamAppResponse>,并从字典中提取对应游戏ID的响应数据:
[HttpGet("steamapi/{SteamGameId}")] public async Task<ActionResult<GameData>> GetSteamApiGameById(int SteamGameId) { using var httpClient = _httpClientFactory.CreateClient(); var response = await httpClient.GetAsync($"https://store.steampowered.com/api/appdetails?appids={SteamGameId}"); if (!response.IsSuccessStatusCode) { return NotFound("Steam API请求失败"); } var gameData = await response.Content.ReadAsStringAsync(); // 反序列化为字典,键是字符串类型的游戏ID var steamResponseDict = JsonSerializer.Deserialize<Dictionary<string, SteamAppResponse>>(gameData); if (steamResponseDict == null || !steamResponseDict.TryGetValue(SteamGameId.ToString(), out var appResponse)) { return NotFound("未找到对应游戏数据"); } if (!appResponse.Success) { return NotFound("Steam API标记请求失败"); } return Ok(appResponse.Data); }
3. 处理特殊情况(若存在双重序列化)
如果实际gameData是被双重序列化的字符串(例如内容为"{\"249130\":{...}}"),则需要先反序列化一次得到原始JSON:
// 先解析出原始JSON字符串 var rawJson = JsonSerializer.Deserialize<string>(gameData); var steamResponseDict = JsonSerializer.Deserialize<Dictionary<string, SteamAppResponse>>(rawJson);
验证逻辑
- 反序列化字典后,先检查字典是否存在目标游戏ID的键
- 再检查Steam返回的
success标志是否为true - 最后返回
data字段给前端,避免返回冗余的根节点
内容的提问来源于stack exchange,提问作者Chünky
相关产品推荐
相关产品推荐

