You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java JsonPath:如何获取JSON中原始类型属性的所有路径

提取JSON中原始类型属性的JsonPath路径

要解决这个问题,核心是先获取所有JsonPath路径,再过滤掉指向对象或数组类型的路径,只保留指向原始类型(字符串、数字、布尔值、null)的路径。下面是通用的实现方案:

问题分析

你当前使用$..*结合Option.AS_PATH_LIST能拿到所有节点的路径,但其中包含了指向JSON对象(比如$['header'])和数组的路径。我们需要对这些路径逐一校验,判断其对应的节点是否为原始类型,从而过滤出目标路径。

通用解决方案

实现思路

  1. 用原方法获取所有JsonPath路径列表;
  2. 遍历每个路径,解析对应的节点值;
  3. 判断节点类型:如果是Map(对应JSON对象)或Collection(对应JSON数组)则跳过,否则保留该路径;
  4. 最终得到仅指向原始类型的路径集合。

完整代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 03:17:41