JSONPath 查询工具

使用 JSONPath 表达式从 JSON 数据中提取指定节点。支持 $ 根节点、.name 子节点、 ..name 递归下降、[*] 通配符、[0] 数组索引、 [?(expr)] 过滤表达式(==!=><=~ 正则匹配、 &&||!)。12 个预设示例覆盖典型场景,所有查询在浏览器本地完成。

根节点 · 通配符
预设示例(点击载入路径):

✓ JSON 合法(1135 字符)

查询结果4 项)
  • #1string
    Nigel Rees
  • #2string
    Evelyn Waugh
  • #3string
    Herman Melville
  • #4string
    J. R. R. Tolkien

常见问题

什么是 JSONPath?它和 JSON Pointer、jq 有什么区别?

JSONPath 是一种 JSON 数据查询语言,语法形如 $.store.book[0].title, 通过路径表达式从 JSON 中提取节点。它由 Stefan Gössner 于 2007 年提出,2024 年由 IETF 标准化为 RFC 9535。 JSON Pointer(RFC 6901)是更简单的路径语法,形如 /store/book/0/title, 不支持过滤表达式、通配符、递归下降,主要用于 JSON Patch。jq 是功能更强的命令行 JSON 处理工具, 支持管道、函数、变量、条件分支等图灵完备语法,但语法学习成本较高。JSONPath 介于两者之间,适合嵌入式查询场景。

JSONPath 表达式中 $ 和 @ 有什么区别?

$ 表示根节点,是路径的起始点,形如 $.store.book 表示从根开始访问 store.book。 @ 表示当前节点,仅在过滤表达式 [?(...)] 内部使用, 用于引用当前正在判断的数组元素或对象值。例如 $..book[?(@.price < 10)] 中, @ 表示 book 数组中的每个元素,@.price 表示该元素的 price 字段。 @ 不能出现在路径主体中,$ 通常不出现在过滤表达式内(除非显式引用根节点)。

递归下降(..)是什么?和点号访问有什么区别?

点号访问 .name 只访问当前节点的直接子字段,例如 $.store.book 只访问 root.store.book。 递归下降 ..name 会遍历 JSON 树的所有层级,返回所有名为 name 的字段值, 无论它们嵌套多深。例如 $..author 会找到 JSON 中所有层级的 author 字段。 递归下降还可以用 ..* 收集所有节点(对象、数组、原始值), 或 ..book[0] 先递归找 book 字段,再取每个 book 数组的第一个元素。 递归下降是 JSONPath 最强大的特性之一,但性能开销比点号访问大,深度嵌套数据上需注意。

过滤表达式 [?(expr)] 支持哪些运算符?

本工具支持以下过滤运算符: 比较==(等于)、!=(不等于)、>(大于)、 >=(大于等于)、<(小于)、<=(小于等于); 正则匹配=~(如 @.email =~ ".*@example\\.com"); 逻辑&&(与)、||(或)、!(非); 存在性:单独的 @.field 表示该字段存在且非 null。 例如 $..book[?(@.price < 10 && @.category == "fiction")] 表示价格小于 10 且类别为 fiction 的书。 过滤表达式内字符串字面量可用单引号或双引号,数字直接写,布尔与 null 用 true / false / null

数组索引支持哪些形式?负索引怎么用?

单索引[0] 取第一个元素,[2] 取第三个元素; 多索引[0,1,2][0,2,4] 一次取多个元素,用逗号分隔; 负索引[-1] 取最后一个元素,[-2] 取倒数第二个,负索引从 -1 开始; 通配符[*] 取数组所有元素,等价于遍历。 本工具暂不支持切片语法 [1:5](起始:结束)与步长 [::2], 如需取连续范围可用多索引 [1,2,3,4] 替代。索引超出范围时返回空结果,不会报错。

JSONPath 在实际开发中有哪些典型应用场景?

API 响应数据提取:RESTful API 返回复杂嵌套 JSON,前端只需部分字段时用 JSONPath 提取,避免手写多层解构; 自动化测试断言:测试框架(如 Postman、JMeter、RestAssured)用 JSONPath 定位响应中的特定字段做断言; JSON 配置查询:大型 JSON 配置文件(如 K8s manifest、OpenAPI spec)中查找特定资源或字段; 日志分析:JSON 格式日志中提取关键字段(如 $..error.message 找所有层级的 error.message); 数据转换:JSON 转 CSV、JSON 转表格时用 JSONPath 指定字段映射; 前端动态表单:根据 JSON Schema 用 JSONPath 实现字段联动与条件显示。 本工具的「复制全部结果」功能可直接生成 JSON 数组,粘贴到代码或文档中使用。

本工具的 JSONPath 实现与标准 RFC 9535 有什么差异?

本工具自研实现,覆盖 RFC 9535 常用语法子集,差异如下: 已支持:$、.name、['name']、[index]、[0,1] 多索引、[*] 通配符、..name 递归下降、..* 递归所有、 [?(filter)] 过滤表达式(==、!=、>、>=、<、<=、=~、&&、||、!)、@ 当前节点、负索引; 暂不支持:切片 [1:5] 与步长 [::2]、 函数(length()count()min()max() 等)、 父节点引用 ^、命名过滤器 [?(@.a>&@.b)] 复杂比较、 多键 ['a','b'](仅单键生效)。 实现采用三阶段架构:tokenizer(词法分析)→ parser(语法分析构建 AST)→ evaluator(求值), 全程零依赖纯函数,便于扩展。如需完整 RFC 9535 实现,可考虑引入 jsonpath-plus 库(约 50KB)。

查询结果是数组还是单个值?如何区分?

JSONPath 查询结果始终是数组(节点列表),即使只匹配到一个元素。 例如 $.store.book[0].title 返回 ["Sayings of the Century"](含一个字符串的数组), 而非裸字符串 "Sayings of the Century"。 这是因为 JSONPath 设计上需要支持多匹配场景(如 $..author 返回多个作者), 为保持一致性,单匹配也用数组包裹。 本工具的「复制单条」按钮会复制该元素的原始值(去除数组包裹), 「复制全部」按钮会复制完整的 JSON 数组。在代码中使用时需注意取第一个元素: jsonpath.query(data, '$.store.book[0].title')[0]