C#无对应实体类时如何访问Http请求返回JSON的属性值
问题原因说明
你遇到的两个问题分别来自以下原因:
- 调用
ReadFromJsonAsync<object>()时,System.Text.Json默认会将JSON对象反序列化为JsonElement类型而非动态类型,无法直接用索引器["name"]访问属性,所以会报错。 - 调用
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
相关产品推荐
相关产品推荐

