如何从C#的JsonResult中反序列化提取Token?
解决方法
你不需要序列化JsonResult,真正的API返回数据存在RestResponse的Content属性里,直接从这里提取JSON字符串再反序列化就能拿到Token。
步骤1:定义反序列化模型(可选,也可以用动态解析)
先创建一个和返回JSON结构匹配的类,方便强类型解析:
public class TokenResponse { public string Token { get; set; } }
方案一:修改API调用方法,直接返回Token
如果这个方法的核心目的是获取Token,可以直接在方法内解析后返回:
public async Task<IActionResult> NetExplorerAPI(string AdresseAPI, object Requete, RestSharp.Method Methode) { var client = new RestClient(AdresseAPI); var request = new RestRequest(); request.Method = Methode; // 修复原代码硬编码Post的问题,使用传入的请求方法 request.AddJsonBody(Requete); request.AddHeader("Accept", "application/json"); RestResponse response = await client.ExecuteAsync(request); // 解析响应内容获取Token if (!string.IsNullOrEmpty(response.Content)) { var tokenResponse = JsonConvert.DeserializeObject<TokenResponse>(response.Content); return new JsonResult(tokenResponse.Token); // 直接返回Token字符串 } // 处理请求失败场景 return BadRequest("获取Token失败"); }
方案二:保留原方法,在调用后解析Token
如果必须保留原方法的返回结构,调用后从JsonResult中取出RestResponse再解析:
// 调用API方法 var actionResult = await NetExplorerAPI("你的API地址", 请求对象, RestSharp.Method.Post); // 从JsonResult中提取RestResponse if (actionResult is JsonResult jsonResult && jsonResult.Value is RestResponse response) { if (!string.IsNullOrEmpty(response.Content)) { // 方式1:用强类型模型解析 var tokenResponse = JsonConvert.DeserializeObject<TokenResponse>(response.Content); string token = tokenResponse.Token; // 方式2:用JObject动态解析(无需定义模型) // var jsonObj = JObject.Parse(response.Content); // string token = jsonObj["token"].ToString(); } }
原代码的问题说明
- 原代码中
request.Method硬编码为Post,没有使用传入的Methode参数,这会导致传入其他请求方法时不生效 - 序列化
JsonResult会得到大量无关内容,因为JsonResult的Value是完整的RestResponse对象,包含了响应状态码、请求头、响应头等元数据,真正的业务数据只在RestResponse.Content中
内容的提问来源于stack exchange,提问作者SylvainKrier
相关产品推荐
相关产品推荐

