如何通过HttpClient获取JSON并提取指定dfId对应的片段?
如何通过HttpClient读取JSON结果中的指定片段?
你已经通过JObject.Parse完成了JSON的解析,接下来可以利用LINQ结合Newtonsoft.Json的API,根据dfId这个唯一标识提取目标片段,以下是具体实现:
修改后的完整代码
try { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Accept.Clear(); client.BaseAddress = new Uri(_serviceConfig.DataGapsBaseUrl); var request = new HttpRequestMessage(HttpMethod.Get, "/piper/jobs/" + jobId.ToString() + "/status"); var token = await GetToken(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); var response = await client.SendAsync(request); var result = await response.Content.ReadAsStringAsync(); var info = JObject.Parse(result); // 定义要匹配的目标dfId string targetDfId = "ad2bb0db-402a-47f6-928d-3fe4276ee417"; // 获取execution数组 var executionArray = info["execution"] as JArray; if (executionArray == null) { // 处理数组不存在的情况 return false; } // 情况1:提取execution数组中直接包含目标dfId的项 var targetExecutionItem = executionArray.FirstOrDefault(item => item["dfId"]?.ToString() == targetDfId); if (targetExecutionItem != null) { // 可以获取该片段中的具体字段,比如output、status string status = targetExecutionItem["status"]?.ToString(); string output = targetExecutionItem["output"]?.ToString(); // 后续逻辑处理 } // 情况2:提取execution数组中tasks子数组里的目标dfId项 var targetTaskItem = executionArray .SelectMany(exec => exec["tasks"]?.Children<JObject>() ?? Enumerable.Empty<JObject>()) .FirstOrDefault(task => task["dfId"]?.ToString() == targetDfId); if (targetTaskItem != null) { // 获取task中的字段,比如name、parameters string taskName = targetTaskItem["name"]?.ToString(); string parameters = targetTaskItem["parameters"]?.ToString(); // 后续逻辑处理 } return true; } catch (Exception ex) { // 异常处理逻辑 return false; }
关键步骤说明
- 获取execution数组:通过
info["execution"] as JArray将JSON中的数组节点转换为JArray类型,方便后续遍历。 - 筛选目标项:
- 对于execution数组中直接包含
dfId的项,使用FirstOrDefault结合条件判断匹配目标dfId。 - 对于嵌套在
tasks数组中的项,使用SelectMany扁平化所有tasks数组,再筛选匹配的项。
- 对于execution数组中直接包含
- 空值处理:使用
?.空传播运算符避免空引用异常,同时提前判断数组是否存在。
内容的提问来源于stack exchange,提问作者Chaka
相关产品推荐
相关产品推荐

