JSONPath 测试器

实时测试 JSONPath 表达式,查看匹配结果并高亮显示。支持过滤器、通配符和递归下降。免费,基于浏览器。

  • 在浏览器中处理
  • 数据不离开你的设备
  • 免费 · 无需注册
表达式以 $ 开头。任一输入变化都会查询。支持 RFC 9535 的通配符、负索引、切片和过滤器;不支持的语法会显示字符位置。表达式为空时清空结果。
示例
展开「示例」并选择查询,只会替换表达式,再查询当前 JSON,不会重新载入书店数据。收起「示例」不会改变表达式。
编辑预载的书店 JSON,或粘贴自己的 JSON 值。输入时实时查询,数字使用 JavaScript 精度。焦点在本工具内时,Ctrl+L(Mac 为 ⌘+L)清空两项输入和结果。

输入 JSON 和 JSONPath 表达式后,这里显示匹配的值。

结果 结果显示匹配的值,不显示规范化路径。单条匹配直接显示该值,多条组成 JSON 数组。无匹配和输入错误有不同提示;长结果在栏内滚动。 「复制」包含完整显示的 JSON,单个字符串保留引号,缩进为两个空格。出错或无匹配时不可复制;复制失败后可再次点击重试。
阅读完整使用指南 JSONPath 在线测试工具:不写代码也能查询 JSON 数据
示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。

JSONPath 语法参考(RFC 9535)

  • $ — 文档根节点
  • .key、['key']、["key"] — 对象成员
  • [n]、[-1] — 数组元素;负索引从末尾倒数
  • [start:end:step] — 切片,例如[0:2]、[1:]、[::-1]
  • [0,2]、['title','price'] — 一个方括号里放多个选择器,结果按选择器顺序排列
  • [*]、.* — 全部数组元素或对象成员值
  • ..key、..[0]、..* — 任意深度的后代
  • [?@.price < 10] — 过滤器;也可写成 [?(@.price < 10)]
  • [?@.isbn]、[?!@.isbn] — 成员存在 / 不存在
  • [?@.a.b == 'x' && @.c > $.min] — 过滤器内的嵌套路径、&& || !、以 $ 开头的绝对路径
  • length()、count()、match()、search()、value() — RFC 9535 定义的 5 个函数

限制

  • RFC 9535 之外的语法会显示「不支持的语法」和字符位置:脚本表达式 [(...)]、=~、in / nin,以及其他库用 ~ 取成员名之类的扩展。
  • $.store.book.length 选取名为 length 的成员,数组没有这个成员,所以结果为空。要按长度筛选,请在过滤器中用 length(),例如 $[?length(@.book) > 3]。
  • 结果只列出匹配的值,不显示规范化路径(如 $['store']['book'][0])。
  • 对象成员按 JSON 文本中的顺序返回。RFC 9535 没有规定这个顺序,其他实现可能不同。
  • match() 与 search() 把 . 换成 [^\n\r] 后,按带 u 标志的 JavaScript 正则执行(RFC 9485 §5.3)。JavaScript 不接受的模式结果为 false;\d、先行断言等只有 JavaScript 支持的写法也会被接受。
  • 数字经 JSON.parse 转成 JavaScript 数字,大于 253 的整数在比较前就已丢失精度。

常见使用场景

JSONPath 常用于从 API 响应中提取数据、编写 kubectl 的 -o jsonpath 输出模板,以及 AWS Step Functions 的 InputPath 等字段。 这些地方用的是各自的方言:kubectl 要求表达式写在大括号里,Step Functions 的 ResultPath 不能用过滤器;本工具按 RFC 9535 解析。 熟练掌握 JSONPath 查询可以大幅提高处理嵌套 JSON 结构的效率。

FAQ

什么是 JSONPath?

JSONPath 是 JSON 的查询语言,类似于 XML 的 XPath。它使用路径表达式从 JSON 文档中选取节点,RFC 9535(2024 年)对它做了标准化。kubectl 的输出模板、AWS Step Functions 和不少 API 测试工具都使用它的变体。

JSONPath 表达式中的 $ 是什么意思?

$ 指 JSON 文档的根元素。所有有效的 JSONPath 表达式必须以 $ 开头。单独使用时,$ 选取整个文档;之后可以链式添加选择器,例如 $.store.book[0].title。

如何选取数组中的所有元素?

在数组键名后使用通配符选择器 [*]。例如,$.store.book[*] 返回数组中所有 book 对象。还可以进一步提取每个元素的字段:$.store.book[*].author 返回所有 author 值。

过滤表达式如何使用?

过滤器写作 [?表达式],@ 表示正在判断的元素。按 RFC 9535,括号可写可不写,$.store.book[?@.price < 10] 与 $.store.book[?(@.price < 10)] 等价。可用 ==、!=、<、<=、>、>= 比较,用 &&、||、! 组合条件,判断 @.author.name 这样的嵌套路径,用 $ 与文档其他位置比较,并可调用 length()、count()、match()、search()、value()。

递归下降(..)是什么?

.. 运算符递归搜索当前节点的所有后代。例如,$..author 在整个 JSON 树中查找所有 author 字段,无论嵌套深度如何。

为什么显示「不支持的语法」?

表达式用了 RFC 9535 没有定义的语法,工具会停下并给出字符位置,不会返回空结果。常见的有脚本表达式 [(@.length-1)](改用 [-1])、=~ 运算符(改用 match() 或 search())、in / nin。显示「未找到匹配项」则说明表达式合法,只是 JSON 里没有符合的内容。