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

C#无对应实体类时如何访问Http请求返回JSON的属性值

问题原因说明

你遇到的两个问题分别来自以下原因:

  1. 调用ReadFromJsonAsync<object>()时,System.Text.Json默认会将JSON对象反序列化为JsonElement类型而非动态类型,无法直接用索引器["name"]访问属性,所以会报错。
  2. 调用ReadAsStringAsync()后返回的结果出现空数组结构,是因为你直接将读取到的JSON字符串传入了Ok()方法,ASP.NET Core会自动对返回值做二次JSON序列化,最终返回的是序列化后的字符串结构,而非原始JSON。

解决方案

方案1:使用.NET内置System.Text.Json处理(无需额外安装依赖)

直接将返回结果反序列化为JsonDocument类型,通过内置API访问属性:

using (var askPensionerDetails = new HttpClient())
{
    askPensionerDetails.BaseAddress = new Uri("http://localhost:55345/api/pensionerdetails/");
    // 建议用await替代Wait()/Result避免ASP.NET Core线程死锁
    var result = await askPensionerDetails.GetAsync("getById?pan=" + inputOfPensioner.PAN);
    if (result.IsSuccessStatusCode)
    {
        var jsonDoc = await result.Content.ReadFromJsonAsync<JsonDocument>();
        // 访问一级属性示例
        string name = jsonDoc.RootElement.GetProperty("name").GetString();
        string pan = jsonDoc.RootElement.GetProperty("pan").GetString();
        int salaryEarned = jsonDoc.RootElement.GetProperty("salaryEarned").GetInt32();
        // 访问嵌套属性示例
        JsonElement bankDetails = jsonDoc.RootElement.GetProperty("bankDetails");
        string bankName = bankDetails.GetProperty("bankName").GetString();
        string accountNumber = bankDetails.GetProperty("accountNumber").GetString();

        // 如果需要直接返回原始JSON给前端,用Content避免二次序列化
        var rawJson = await result.Content.ReadAsStringAsync();
        return Content(rawJson, "application/json");
    }
    // 异常处理逻辑
    return StatusCode((int)result.StatusCode);
}

方案2:使用Newtonsoft.Json处理(语法更灵活)

如果需要更简便的属性访问语法,可以先安装NuGet包Newtonsoft.Json,再通过JObject解析:

using Newtonsoft.Json.Linq;

// 其余请求逻辑同上
if (result.IsSuccessStatusCode)
{
    var rawJson = await result.Content.ReadAsStringAsync();
    JObject jObj = JObject.Parse(rawJson);
    // 访问一级属性
    string name = jObj["name"].Value<string>();
    string pan = jObj["pan"].Value<string>();
    int salaryEarned = jObj["salaryEarned"].Value<int>();
    // 访问嵌套属性
    string bankName = jObj["bankDetails"]["bankName"].Value<string>();
    // 支持直接判断属性是否存在,避免运行时报错
    if (jObj.ContainsKey("allowances"))
    {
        int allowances = jObj["allowances"].Value<int>();
    }

    // 返回原始JSON
    return Content(rawJson, "application/json");
}

内容的提问来源于stack exchange,提问作者Harsha Gangari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:24:04