C#解析Steam API返回JSON提示无法反序列化数据如何解决
核心错误点
你的代码有三处直接导致反序列化失败的逻辑问题:
- JSON节点路径写错了:返回的JSON根节点下只有
response字段,players数组是嵌套在response节点内的,你直接读取jUser["players"]拿到的是空值,根本获取不到玩家数据。 - 数据类型不匹配:
players是数组结构,哪怕接口只返回单个玩家的信息,它也是数组格式,你直接把整个数组反序列化成单个SteamUser实例,必然抛出类型转换错误。 - 赋值逻辑错误:
JsonConvert.DeserializeObject<Models.SteamUser>()本身就返回SteamUser类型的对象,你额外调用.ToString()把对象转成了字符串,再赋值给Models.SteamUser类型的persona变量,类型完全不匹配。
修复步骤
- 先确认你的
SteamUser模型类属性和接口返回字段对应,参考结构如下:
public class SteamUser { public string steamid { get; set; } public int communityvisibilitystate { get; set; } public int profilestate { get; set; } public string personaname { get; set; } public int commentpermission { get; set; } public string profileurl { get; set; } public string avatar { get; set; } public string avatarmedium { get; set; } public string avatarfull { get; set; } public string avatarhash { get; set; } public int personastate { get; set; } }
如果你的模型用了C#常规的大驼峰命名(比如Personaname、Avatar),给对应属性加上[JsonProperty("JSON字段名")]特性做映射即可,避免字段名不匹配导致取值为空。
- 修改接口调用和反序列化代码,修正访问路径、处理数组结构、删掉多余的类型转换:
Models.SteamUser persona; string httpres; using (var client = new HttpClient()) { string steamurl = "MY HIDDEN URL HERE" + s64; var steamapi = new Uri(steamurl); // 建议后续改成await异步写法,.Result同步阻塞容易出现上下文死锁问题 var result = client.GetAsync(steamapi).Result.Content.ReadAsStringAsync().Result; httpres = result; var jUser = JObject.Parse(result); // 按正确路径取到players数组的第一个元素 var playerToken = jUser["response"]?["players"]?.FirstOrDefault(); if (playerToken == null) { // 增加空判断,处理SteamID错误、接口异常返回空数据的场景 throw new InvalidOperationException("查询不到对应Steam玩家信息"); } persona = playerToken.ToObject<Models.SteamUser>(); }
修改完成后,直接访问persona.personaname就能拿到玩家昵称,persona.avatar就能拿到对应的头像链接。
补充:如果后续需要批量获取多个玩家信息,直接把
players数组反序列化成List<SteamUser>即可,不需要单独取第一个元素。
内容的提问来源于stack exchange,提问作者James Radcliff
相关产品推荐
相关产品推荐

