调用外部Web API返回JSON结果后如何访问其中的各个字段值
解决方案
首先修正你的代码问题
你当前写的var result = post.Content.ReadAsStringAsync();拿到的是异步任务对象,不是实际的JSON字符串,需要改写成:
// 同步写法(不推荐高并发场景使用,容易造成线程阻塞) string jsonResult = post.Content.ReadAsStringAsync().Result; // 更推荐的异步写法,需要将方法标记为async // string jsonResult = await post.Content.ReadAsStringAsync();
方案1:强类型解析(推荐,性能稳定、不易出错)
提前定义和返回JSON结构匹配的实体类,解析后直接通过属性访问字段,适合正式业务场景使用。
第一步:定义实体类
// 对应JSON中Data节点的结构 public class ApiResultData { public int state { get; set; } public string message { get; set; } public string WorkName { get; set; } public string WorkUrl { get; set; } } // 对应整个JSON返回的外层结构 public class ApiResponse { public int Status { get; set; } public ApiResultData Data { get; set; } public string Message { get; set; } }
第二步:解析并访问字段
.NET Core 3.0+ / .NET 5+ 自带System.Text.Json库可直接使用,无需安装第三方包:
if (post.IsSuccessStatusCode) { string jsonStr = await post.Content.ReadAsStringAsync(); // 解析JSON到强类型对象 ApiResponse response = System.Text.Json.JsonSerializer.Deserialize<ApiResponse>(jsonStr); // 按需访问对应字段示例 int outerStatus = response.Status; string outerMessage = response.Message; int dataState = response.Data.state; string dataMessage = response.Data.message; string workName = response.Data.WorkName; string workUrl = response.Data.WorkUrl; }
如果你使用的是.NET Framework,可以安装Newtonsoft.Json NuGet包,对应解析写法为:
ApiResponse response = Newtonsoft.Json.JsonConvert.DeserializeObject<ApiResponse>(jsonStr);
方案2:无需定义类的动态解析(适合临时快速取值场景)
如果你不想提前定义匹配结构的类,可以直接解析JSON节点取值:
if (post.IsSuccessStatusCode) { string jsonStr = await post.Content.ReadAsStringAsync(); using System.Text.Json.JsonDocument doc = System.Text.Json.JsonDocument.Parse(jsonStr); System.Text.Json.JsonElement root = doc.RootElement; // 访问外层节点 int status = root.GetProperty("Status").GetInt32(); string outerMsg = root.GetProperty("Message").GetString(); // 访问Data下的子节点 System.Text.Json.JsonElement dataNode = root.GetProperty("Data"); int state = dataNode.GetProperty("state").GetInt32(); string workName = dataNode.GetProperty("WorkName").GetString(); string workUrl = dataNode.GetProperty("WorkUrl").GetString(); }
注意事项
- 如果不能确定返回的JSON一定包含对应字段,建议使用
TryGetProperty方法判断字段是否存在再取值,避免抛出异常 - 高并发场景下不要使用
.Result同步调用异步方法,建议全程用await异步写法避免线程阻塞
内容的提问来源于stack exchange,提问作者nnmmss
相关产品推荐
相关产品推荐

