🔎 JSONPath 测试器
对 JSON 数据实时评估 JSONPath 查询(如 $.store.book[*].author)。支持过滤器、递归下降和通配符。
完全免费
无需注册
浏览器内完成
5 种语言
深色模式
🔒 关于隐私
- ・所有处理均在您的浏览器中完成
- ・输入数据绝不会发送到任何服务器
📚 JSONPath 语法帮助
$ — 根对象@ — 当前节点(过滤器内).field / ['field'] — 子元素访问.. — 递归下降* — 通配符[index] — 数组索引[start:end:step] — 数组切片[a,b,c] — 多个索引/字段[?(@.price < 10)] — 过滤表达式[?(@.tags)] — 字段存在📖 常见的坑
对 JSON 实时求值 JSONPath 查询,显示匹配到的值与条数,支持递归下降、通配符、切片与过滤表达式。处理全部在浏览器内完成。直到 2024 年的 RFC 9535 之前,JSONPath 一直没有正式规范——在那之前的十七年里,各实现都在按自己的理解解读一篇 2007 年的文章,因此同一个表达式在不同实现中会返回不同的结果。
| 情形 | 会发生什么 | 怎么处理 |
|---|---|---|
| 同一个表达式在各实现中结果不同 | 歧义主要集中在三处:递归下降与索引的组合——$..book[0] 指的是「每个数组的第一个」还是「把所有 book 汇总后的第一个」;结果是否总是数组,还是在只有一个时返回裸值;以及过滤表达式引用不存在的字段时会怎样。由于换个实现答案就变,它表现为「升级了一下库,突然就不工作了」——而表达式并没有改动,因此原因并不显眼。 |
请选择明确声明遵循 RFC 9535 的库——2024 年之后发布的都会写明。对既有代码而言,唯一的办法是到所用库的文档里确认实际行为。务实的建议是:避开那些歧义所在的写法最为稳妥——不要在递归下降 $.. 之后紧接索引、始终把结果当作数组接收,[0] 交给自己的代码去取、过滤器搭配存在性判断(?(@.price && @.price < 10))。守住这三条,实现差异就几乎影响不到你——表达式写得越花哨,可移植性就越差。 |
| 过滤表达式跑不通 | 数值比较 ?(@.price < 10) 在多数实现中都能工作,但字符串比较会撞上引号风格的问题:有的实现不接受 ?(@.category == 'fiction') 里的单引号,也有的实现不接受双引号。RFC 9535 两者皆许,但更早的实现往往只认其中一种。更麻烦的是,有的实现会因运算符前后有无空格而失败,有的则要求写 = 而不是 ==——而且它们都不会报错,只是返回 0 条。 |
不要一口气写完查询,请分阶段逐层收窄——先看 $,再 $.store、$.store.book、$.store.book[*],最后才加过滤器,你就能准确看出是在哪一步变成 0 条的。这是调试这类查询语言最快的方法,因为单看「0 条」这个结果,根本分不清是拼写错、是数据本来就没有、还是语法没被解析器接受。确认是过滤器的问题后,请按「换引号风格、去掉运算符两侧空格、试 == 与 =」的顺序逐个排查。而当所需的过滤逻辑变复杂时,改用代码来写更易读,也能写测试。 |
| 把 JSONPath、JMESPath、jq 混为一谈 | 名字与外观都很像,但这是三种不同的语言,语法上几乎没有兼容性。AWS CLI 的 --query 是 JMESPath——写作 Reservations[].Instances[].InstanceId,不用 $。kubectl -o jsonpath 是 Kubernetes 自有的方言——要用 {} 包裹,可省略 $,还有自己的 range 语法。jq 则是完全独立的查询语言——有管道、变量,甚至函数定义。从网上抄来的表达式贴上去跑不通,原因多半在此;发现「以为是 JSONPath 的文章」其实讲的是 JMESPath,也是常有的事。 |
使用之前,请先确认「这是哪一种语言」。辨认很简单:以 $ 开头是 JSONPath;没有 $ 而用 [] 和 | 是 JMESPath;一串 .field、select() 和管道则是 jq。还有一点:JSONPath 是只读的——它不能改值、不能重构结构、也不能聚合。若想对取出的结果做加工,请用 jq——jq 是转换语言,map、group_by、reduce 一应俱全。大致的取舍是:从配置文件里取一个值用 JSONPath,在 shell 里加工 JSON 用 jq,操作 AWS 用 JMESPath——在可以自选的场合,跟随该环境中已有的用法,摩擦最小。 |
动用 JSONPath 之前,先想想是否真的需要它。在程序内部处理 JSON 时,先解析、再按原生结构遍历,能获得类型、能定位错误、也能写测试——data.store.book.filter(b => b.price < 10) 显然比埋在字符串里的 $.store.book[?(@.price<10)] 更好读,编辑器还能补全。JSONPath 真正有价值的场合,是查询要在运行时才决定——在配置文件中指定抽取条件、由用户定义映射关系、保存日志的检索条件,这类「查询本身就是数据」的场景。此时请当心来自外部的查询:JSONPath 本身不执行代码,但让别人对着一份巨大的 JSON 跑递归下降 $..,就会消耗你的 CPU 与内存。请同时对输入大小与表达式复杂度设上限。
📖 使用方法
-
1
粘贴 JSON将 JSON 数据粘贴到左侧。示例按钮可加载演示数据。
-
2
输入查询输入以 $ 开头的 JSONPath 表达式,结果实时更新。
-
3
查看结果匹配值会在右侧整形显示,同时显示计数和错误。
❓ 常见问题
什么是 JSONPath?
类似于 XML 的 XPath,用于 JSON 的查询语言。
如何编写过滤表达式?
@ 表示当前节点,支持比较和逻辑运算符。字符串用单引号包围。
何时使用递归下降 (..)?
查找任意深度的所有匹配项。
🔗 相关工具
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
✅
感谢您的反馈!
已送达运营者,将用于改进工具。