跳到正文

JSONPath 测试器

JSONPath Tester

对文档运行 JSONPath 表达式,边输入边高亮命中的节点。

对一份文档运行 JSONPath 查询,显示它选中的每个节点和到达每个节点的路径。它实现的是 RFC 9535——2024 年的标准——而不是此前二十年里互不兼容的实现之一,一旦你的查询里带了过滤器,这一点就很要紧。

🔒 完全在你的浏览器里运行jsonjsonpathquerytest

查询

从根开始:在它下面的任何地方,成员“book”;然后通过过滤器的子节点;然后成员“title”。

文档

匹配

你一边输入,结果就一边出现在这里。

这里遵循 2024 年的标准 RFC 9535,而不是它之前二十年里那些互不兼容的实现。真正会咬人的差别是:结果是一个节点列表,会保留重复,.. 会先访问节点自身再访问它的子节点;缺失的成员只等于另一个缺失的成员;拿一个可能匹配多个节点的查询去比较是语法错误,而不是靠猜。match() 和 search() 里的模式交给浏览器自己的正则引擎,它接受的比 RFC 规定的 I-Regexp 方言更多。

怎么用

  1. 粘贴文档

    任何能解析为 JSON 的东西。查询在 worker 里运行,所以大文档在你输入时页面仍然响应。

  2. 写查询,或从示例开始

    输入框下方的按钮覆盖了人们需要的形状:通配符、后代搜索、切片、过滤器、正则表达式和函数。上方会出现一段说明你的查询是什么意思的白话描述。

  3. 连同路径一起读匹配结果

    每个结果都带着到达它的规范化路径,所以你能看出一个匹配是不是来自你预期的地方。统计行会说明查询是否是单值的——最多只能选中一个节点——那也就是一个 JSON Pointer 能做到的事。

常见问题

我的查询在别的工具里能用,在这里不行。

多半是 RFC 9535 的差异。标准去掉了老实现允许的东西:`()` 里的脚本表达式、带旧式括号过滤语法的 `$..[?(@.x)]`,以及和一个可能匹配多个节点的查询做比较——最后这一种现在是语法错误,而不是靠猜。

为什么同一个值出现了两次?

因为结果是节点列表,不是集合。`$..price` 沿两条分支到达同一个节点就会列出两次,这是有意的——去重会丢掉每个匹配来自哪里的信息。

`match()` 里的正则表达式是标准的吗?

不完全是。RFC 规定的是 I-Regexp,一个小方言;这里的模式交给了你浏览器自己的引擎,它接受的更多。在这里能用的模式可能被严格的实现拒绝——放进生产环境之前值得知道。

它能修改文档吗?

不能——JSONPath 只选择,不写入。要编辑的话,这里显示的路径是 RFC 6901 指针,可以直接放进 JSON Patch,本站的 JSON 对比工具能生成它。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。