Java JsonPath:如何获取JSON中原始类型属性的所有路径
提取JSON中原始类型属性的JsonPath路径
要解决这个问题,核心是先获取所有JsonPath路径,再过滤掉指向对象或数组类型的路径,只保留指向原始类型(字符串、数字、布尔值、null)的路径。下面是通用的实现方案:
问题分析
你当前使用$..*结合Option.AS_PATH_LIST能拿到所有节点的路径,但其中包含了指向JSON对象(比如$['header'])和数组的路径。我们需要对这些路径逐一校验,判断其对应的节点是否为原始类型,从而过滤出目标路径。
通用解决方案
实现思路
- 用原方法获取所有JsonPath路径列表;
- 遍历每个路径,解析对应的节点值;
- 判断节点类型:如果是
Map(对应JSON对象)或Collection(对应JSON数组)则跳过,否则保留该路径; - 最终得到仅指向原始类型的路径集合。
完整代码示例
import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Option; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; public class JsonPathFilter { public static void main(String[] args) { String jsonString = "{ \"header\": { \"version\": 2, \"original\": \"ori\", \"parent\": \"par\", \"eventId\": 11, \"correlation\": \"uuid\", \"timestamp\": \"03.04.2020\", \"local\": true, \"location\": { \"facility\": { \"id\": 3, \"type\": \"en\" } } }, \"body\": { \"field\": 3 } }"; // 初始化配置,获取所有路径列表 Configuration configuration = Configuration.builder().options(Option.AS_PATH_LIST).build(); List<String> allPaths = JsonPath.using(configuration).parse(jsonString).read("$..*"); // 过滤出仅指向原始类型的路径 List<String> primitivePaths = new ArrayList<>(); Object parsedJson = JsonPath.parse(jsonString).json(); for (String path : allPaths) { Object node = JsonPath.read(parsedJson, path); // 判断是否为原始类型:不是对象(Map)也不是数组/集合(Collection) if (!(node instanceof Map) && !(node instanceof Collection)) { primitivePaths.add(path); } } // 打印结果 primitivePaths.forEach(System.out::println); } }
代码说明
Option.AS_PATH_LIST:让JsonPath返回所有匹配节点的路径字符串列表;- 类型判断逻辑:
instanceof Map对应JSON对象,instanceof Collection对应JSON数组,排除这两类后,剩下的就是原始类型(String、Integer、Boolean等); - 提前解析一次JSON对象
parsedJson,避免每次读取路径都重新解析,提升性能。
测试结果
运行上述代码后,输出的路径与你期望的结果完全一致:
$['header']['version']
$['header']['original']
$['header']['parent']
$['header']['eventId']
$['header']['correlation']
$['header']['timestamp']
$['header']['local']
$['header']['location']['facility']['id']
$['header']['location']['facility']['type']
$['body']['field']
这个逻辑具备通用性,不管输入的JSON结构多么复杂,都能准确过滤出指向原始类型属性的路径。
内容的提问来源于stack exchange,提问作者Serhii Kachan
相关产品推荐
相关产品推荐

