使用Json.NET反序列化根对象键未知的Steam API返回JSON
处理Steam API动态根键JSON的反序列化方案
这问题我之前帮不少开发者解决过——Steam API返回的这种顶层动态键确实有点坑,不过处理起来其实挺简单的,核心思路就是绕开那个未知的根键,直接提取它对应的游戏信息对象就行。下面分几种常用编程语言给你具体方案:
C#(使用Newtonsoft.Json)
首先定义对应游戏信息的实体类,匹配JSON里的结构:
public class GameInfo { public bool success { get; set; } public GameData data { get; set; } } public class GameData { public string type { get; set; } public string name { get; set; } public int steam_appid { get; set; } public int required_age { get; set; } public bool is_free { get; set; } }
然后用字典来接收整个JSON结构,再提取值:
var json = "{ \"578080\": { \"success\": true, \"data\": { \"type\": \"game\", \"name\": \"PLAYERUNKNOWN'S BATTLEGROUNDS\", \"steam_appid\": 578080, \"required_age\": 0, \"is_free\": false } } }"; // 反序列化为字典,键是游戏ID字符串,值是GameInfo对象 var gameDict = JsonConvert.DeserializeObject<Dictionary<string, GameInfo>>(json); // 提取唯一的游戏信息(单个游戏查询只会有一个键值对) var targetGameInfo = gameDict.Values.First();
如果你不想用字典,也可以直接解析JSON对象后提取值:
var jObject = JObject.Parse(json); var targetGameInfo = jObject.Values().First().ToObject<GameInfo>();
Python
Python用标准库就能轻松处理,不需要额外依赖:
import json json_str = '''{ "578080": { "success": true, "data": { "type": "game", "name": "PLAYERUNKNOWN'S BATTLEGROUNDS", "steam_appid": 578080, "required_age": 0, "is_free": false } } }''' # 加载JSON为字典 game_data = json.loads(json_str) # 提取字典中的第一个值(即游戏信息) game_info = next(iter(game_data.values())) # 之后就可以正常访问字段了 print(game_info["success"]) print(game_info["data"]["name"])
JavaScript/TypeScript
JS里处理这种动态键最便捷,用Object.values()直接提取值:
const jsonStr = `{ "578080": { "success": true, "data": { "type": "game", "name": "PLAYERUNKNOWN'S BATTLEGROUNDS", "steam_appid": 578080, "required_age": 0, "is_free": false } } }`; const gameData = JSON.parse(jsonStr); // 提取顶层对象的所有值,取第一个元素 const gameInfo = Object.values(gameData)[0]; // 访问属性示例 console.log(gameInfo.success); console.log(gameInfo.data.name);
核心思路总结
本质上不管用哪种语言,核心都是把顶层的动态键值对当成集合(字典、对象)处理,然后直接提取对应的值,而不是试图把动态的根键映射到某个固定的类属性上——毕竟这个键是随查询的游戏ID变化的,没法提前定义。
内容的提问来源于stack exchange,提问作者Sean O'Neil
相关产品推荐
相关产品推荐

