JSONPath 测试器
JSONPath Tester
对文档运行 JSONPath 表达式,边输入边高亮命中的节点。
对一份文档运行 JSONPath 查询,显示它选中的每个节点和到达每个节点的路径。它实现的是 RFC 9535——2024 年的标准——而不是此前二十年里互不兼容的实现之一,一旦你的查询里带了过滤器,这一点就很要紧。
查询
从根开始:在它下面的任何地方,成员“book”;然后通过过滤器的子节点;然后成员“title”。
文档
匹配
你一边输入,结果就一边出现在这里。
这里遵循 2024 年的标准 RFC 9535,而不是它之前二十年里那些互不兼容的实现。真正会咬人的差别是:结果是一个节点列表,会保留重复,.. 会先访问节点自身再访问它的子节点;缺失的成员只等于另一个缺失的成员;拿一个可能匹配多个节点的查询去比较是语法错误,而不是靠猜。match() 和 search() 里的模式交给浏览器自己的正则引擎,它接受的比 RFC 规定的 I-Regexp 方言更多。
怎么用
粘贴文档
任何能解析为 JSON 的东西。查询在 worker 里运行,所以大文档在你输入时页面仍然响应。
写查询,或从示例开始
输入框下方的按钮覆盖了人们需要的形状:通配符、后代搜索、切片、过滤器、正则表达式和函数。上方会出现一段说明你的查询是什么意思的白话描述。
连同路径一起读匹配结果
每个结果都带着到达它的规范化路径,所以你能看出一个匹配是不是来自你预期的地方。统计行会说明查询是否是单值的——最多只能选中一个节点——那也就是一个 JSON Pointer 能做到的事。
常见问题
我的查询在别的工具里能用,在这里不行。
多半是 RFC 9535 的差异。标准去掉了老实现允许的东西:`()` 里的脚本表达式、带旧式括号过滤语法的 `$..[?(@.x)]`,以及和一个可能匹配多个节点的查询做比较——最后这一种现在是语法错误,而不是靠猜。
为什么同一个值出现了两次?
因为结果是节点列表,不是集合。`$..price` 沿两条分支到达同一个节点就会列出两次,这是有意的——去重会丢掉每个匹配来自哪里的信息。
`match()` 里的正则表达式是标准的吗?
不完全是。RFC 规定的是 I-Regexp,一个小方言;这里的模式交给了你浏览器自己的引擎,它接受的更多。在这里能用的模式可能被严格的实现拒绝——放进生产环境之前值得知道。
它能修改文档吗?
不能——JSONPath 只选择,不写入。要编辑的话,这里显示的路径是 RFC 6901 指针,可以直接放进 JSON Patch,本站的 JSON 对比工具能生成它。
可以从这些接进来
接下来
这些工具吃得下当前工具的产出,结果可以直接送过去。
jq 在线试验场
jq Playground
在浏览器里对粘贴的 JSON 跑 jq 1.7 过滤器,附一份速查表,并给出等效的命令行。
JSON 对比
JSON Diff
按结构比较两份 JSON,忽略键的顺序,报出新增、删除和改动的路径。
JSON 格式化与校验
JSON Formatter & Validator
把 JSON 美化成缩进形式或压成一行,校验语法并直接指出出错的行和列。
XPath 测试器
XPath Tester
对 XML 或 HTML 求值 XPath 或 CSS 选择器,把命中的节点全部列出来。
JSON ⇄ CSV 互转
JSON ⇄ CSV
把嵌套 JSON 按点路径列名拍平成列,或者从表格重新拼回对象。
JSON 转 TypeScript 类型
JSON to TypeScript
从一份 JSON 样例推断 TypeScript 接口或类型,合并可选字段和联合类型。