ASP.NET Core MVC调用JWT认证API反序列化Player模型报错
错误原因
该异常和JWT鉴权逻辑无关——你已经成功拿到200 OK响应,说明令牌传递、鉴权流程是正常的。问题本质是API接口实际返回的数据类型,和你反序列化时指定的目标类型不匹配:
- 你的API接口虽然声明返回类型为
ActionResult<List<Player>>,但Linq查询中加了.Select(p=> p.Name).ToList()投影逻辑,最终实际返回的是List<string>(仅包含玩家姓名字段的字符串数组) - MVC端尝试把JSON格式的字符串数组直接反序列化为
List<Player>对象数组,Json.NET无法将字符串值自动转换为Player复杂类型,因此抛出类型转换异常。
修复方案
根据你的实际业务需求二选一即可:
方案1:修改API端,返回完整Player对象集合
如果前端需要完整的Player模型字段,去掉API查询中的Name投影,直接返回排序后的Player实体列表即可,MVC端代码无需改动:
[HttpGet] [Authorize] public ActionResult<List<Player>> GetAllPlayers() { // 移除Select投影,直接返回Player实体 var players = _applicationDbContext.Players.OrderBy(p => p.Name).ToList(); return Ok(players); }
方案2:修改MVC端反序列化逻辑,适配现有API返回值
如果业务上确实只需要玩家名称,不需要Player的其他字段,无需改动API,调整MVC端的反序列化逻辑即可:
if(response.StatusCode == System.Net.HttpStatusCode.OK) { var strResponse = await response.Content.ReadAsStringAsync(); // 先按实际返回类型反序列化为字符串列表 var playerNames = JsonConvert.DeserializeObject<List<string>>(strResponse); // 若需要组装为Player模型列表,手动映射字段即可 players = playerNames.Select(name => new Player { Name = name }).ToList(); }
内容的提问来源于stack exchange,提问作者ahamad zooghi
相关产品推荐
相关产品推荐

