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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:35:21