You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:45:02