ASP.NET Core中使用HttpClient调用第三方API后提取JSON指定字段
解决方案
你当前代码的核心问题是未指定反序列化的目标类型,且重复读取了HttpContent内容(HttpContent仅可读取一次,使用.Result调用异步方法还可能引发死锁),你可以选择以下两种方案之一提取目标字段:
方案1:使用JObject动态解析(无需定义完整实体类,适合仅提取少量字段场景)
直接借助Newtonsoft.Json的JObject对JSON结构做层级访问,不需要预先定义全量实体类,代码调整如下:
// 建议HttpClient通过依赖注入获取,不要每次new,避免套接字资源耗尽 var client = new HttpClient(); string _ContentType = "application/json"; client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_ContentType)); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", base64EncodedAuthenticationString); var _UserAgent = "d-fens HttpClient"; client.DefaultRequestHeaders.Add("User-Agent", _UserAgent); HttpResponseMessage response = await client.GetAsync(api_URL); // 仅读取一次响应内容 string jsonContent = await response.Content.ReadAsStringAsync(); JObject resJObj = JObject.Parse(jsonContent); // 提取根节点status字段 string rootStatus = resJObj.Value<string>("status"); // 提取transaction数组第一个元素下response节点的acquirerCode string acquirerCode = resJObj["transaction"]?.FirstOrDefault()?["response"]?.Value<string>("acquirerCode"); // 按需校验字段值 bool isSuccess = rootStatus == "CAPTURED" && acquirerCode == "00"; // 可返回你需要的结果,示例返回两个字段 return Ok(new { status = rootStatus, acquirerCode = acquirerCode });
方案2:强类型实体类反序列化(适合需要频繁操作JSON字段的场景)
先定义仅包含所需字段的简化实体类(不需要的字段可以省略不定义):
// 简化的响应实体类,仅保留需要的字段 public class ApiResponse { public string status { get; set; } public List<TransactionItem> transaction { get; set; } } public class TransactionItem { public ResponseNode response { get; set; } } public class ResponseNode { public string acquirerCode { get; set; } }
再调整反序列化逻辑即可直接读取字段:
// HttpClient初始化部分和上面一致,此处省略 HttpResponseMessage response = await client.GetAsync(api_URL); string jsonContent = await response.Content.ReadAsStringAsync(); ApiResponse resContent = JsonConvert.DeserializeObject<ApiResponse>(jsonContent); string rootStatus = resContent.status; string acquirerCode = resContent.transaction?.FirstOrDefault()?.response?.acquirerCode; return Ok(new { status = rootStatus, acquirerCode = acquirerCode });
注意事项
- 代码中加入了
?.空值传播运算符,避免transaction数组为空、无元素或response节点不存在时抛出空引用异常,你可以根据业务需求补充更完善的空值校验逻辑。 - 不要使用
.Result同步调用异步方法,在ASP.NET Core环境下极易引发线程死锁,所有异步操作统一使用await关键字调用。
内容的提问来源于stack exchange,提问作者Ahmed Dawood Salman
相关产品推荐
相关产品推荐

