使用Restsharp解析嵌套JSON响应提取categoryCode值的方法咨询
嵌套JSON全量提取categoryCode字段实现方案
不需要依赖固定JSON结构,不用硬写实体类映射,两种常用实现方案如下:
方案1:Newtonsoft.Json JSONPath查询(最简实现,适配任意嵌套层级)
配合RestSharp使用时直接用JSONPath的递归匹配语法,不管categoryCode藏在多少层嵌套里都能直接定位,不需要关心JSON的返回结构:
- 首先安装NuGet包:
Newtonsoft.Json - 代码示例:
using RestSharp; using Newtonsoft.Json.Linq; // RestSharp请求逻辑 var client = new RestClient("你的接口请求地址"); var request = new RestRequest(); var response = await client.ExecuteAsync(request); // 提取逻辑 if (response.IsSuccessful && !string.IsNullOrEmpty(response.Content)) { var jsonObj = JObject.Parse(response.Content); // $..为JSONPath递归匹配语法,直接匹配所有层级下的categoryCode字段 var categoryCodes = jsonObj.SelectTokens("$..categoryCode") .Select(token => token.Value<string>()) .ToList(); // 拿到的categoryCodes就是所有目标值,示例JSON返回结果为 ["276","295"] }
如果要避免误匹配其他位置的同名字段,你也可以把查询规则写得更精准,只匹配categories数组下的categoryCode:$..categories[*].categoryCode,兼容性和安全性更高。
方案2:System.Text.Json 递归遍历实现(无第三方依赖)
如果你用的是.NET Core 3.0+版本,不想引入Newtonsoft.Json依赖,也可以自己写递归方法遍历JSON节点提取:
using RestSharp; using System.Text.Json; using System.Collections.Generic; // 通用递归提取指定字段值的方法 static List<string> ExtractAllFieldValues(JsonElement element, string targetFieldName) { var results = new List<string>(); // 遍历对象节点 if (element.ValueKind == JsonValueKind.Object) { foreach (var prop in element.EnumerateObject()) { if (prop.Name == targetFieldName && prop.Value.ValueKind == JsonValueKind.String) { results.Add(prop.Value.GetString()); } else { results.AddRange(ExtractAllFieldValues(prop.Value, targetFieldName)); } } } // 遍历数组节点 else if (element.ValueKind == JsonValueKind.Array) { foreach (var item in element.EnumerateArray()) { results.AddRange(ExtractAllFieldValues(item, targetFieldName)); } } return results; } // 调用逻辑 var client = new RestClient("你的接口请求地址"); var request = new RestRequest(); var response = await client.ExecuteAsync(request); if (response.IsSuccessful && !string.IsNullOrEmpty(response.Content)) { var jsonDoc = JsonDocument.Parse(response.Content); var categoryCodes = ExtractAllFieldValues(jsonDoc.RootElement, "categoryCode"); }
两种方案都不需要你适配当前JSON的结构写实体类,后续接口调整嵌套层级、修改结构,只要categoryCode字段名不变,提取逻辑完全不用修改,适配你无法控制JSON返回格式的需求。
内容的提问来源于stack exchange,提问作者Brent Allison
相关产品推荐
相关产品推荐

