JSONPath 查询
JSON对 JSON 文档执行 JSONPath / jq 风格查询,并高亮每一个匹配项。
不获取远程 URL;请直接粘贴你的 JSON。
本页内容
JSONPath 查询器是什么?#
JSON 文档小的时候,用眼睛看就行。但等它长到几千行——一份 API 响应、一份配置快照、一棵依赖树——眼睛就不是合适的工具了。JSONPath 正是为这种场景设计的查询语言:用一句紧凑的表达式说”把所有的 price 字段给我”、“把价格低于 10 的书的标题给我”、或者”不管埋得多深,把所有叫 isbn 的节点给我”。
你可以把它理解为文件路径加一点过滤语法的混合体。$.store.book[0].title 顺着已知结构往下走,和文件系统路径一样;$..author 表示”递归往下,遇到 author 就收一个”;[?(@.price < 10)] 是一个过滤器,只留下当前节点 price 小于 10 的元素。这里的 @ 永远指”我正在审视的当前节点”。
本页把你的 JSON 拿来跑一条 JSONPath 表达式,列出所有命中项,并且——最省时间的部分——直接在格式化后的文档上高亮命中区间,让你一眼看出表达式选中的是不是你以为的那部分。过滤器走的是安全表达式解析器,绝不会去执行代码,所以即便喂进来路不明的 JSON 也不会有任何副作用。
怎么用#
- 把 JSON 贴进左侧的输入栏,或者点 Sample 载入那套经典的书店示例数据。
- 在右侧的 JSONPath 输入框里写表达式。几个常用起点:
$.store.book[*].author——每个数组元素的author。$..author——递归下降,收集任意层级的所有author。$.store.book[?(@.price < 10)].title——带过滤条件。$.store.book[?(@.isbn)].isbn——存在性测试(含有isbn键的才要)。
- 输入框下方的命中列表逐条填入结果,再往下的全宽 JSON 预览会把每个命中区间就地高亮。
- Matches 旁边的表头显示命中数。命中为零的表达式仍然算成功(空列表)——只有语法本身写错的表达式才会报错。
- 工具栏的 Copy matches 把命中值导出成 JSON 数组;Clear 重置两栏。
查询随输入即时触发。如果 JSON 本身就不合法,状态栏会直接指出该修的行列号。
主要特性#
- 就地高亮。 每个命中值都叠加在格式化文档上,所以一条
$..抓回三十个节点的表达式也能立刻看清,而不是淹没在列表里。 - 安全的过滤器求值。
[?(@.price < 10)]这类表达式由专门的解析器求值,不会交给动态代码执行——即便面对恶意输入,本页也始终符合内容安全策略。 - 区分”无命中”与”出错”。 合法但没选中任何东西的表达式报为零命中,只有语法坏掉的表达式才标记为错误,你绝不会把”什么都没找到”和”写错了”搞混。
- 每条命中附带指针。 每个结果都带 JSON Pointer(例如
/store/book/2/title),让你清楚每个值来自树里的哪个位置。 - 导出为数组。 命中值导出成干净的 JSON 数组,方便直接接下一步处理。
- 纯本地处理。 数据在浏览器里查询,没有后端,也不上传。
真实示例#
点 Sample 载入数据,然后跑一个找出便宜书名的过滤器。在 JSONPath 框里输入:
$.store.book[?(@.price < 10)].title
命中列表返回两个书名,因为示例里四本书只有两本的价格低于 10:
[
"Sayings of the Century",
"Moby Dick"
]
JSON 预览会就地高亮这两个 title 值,你能直接看出另外两本为何被排除——《Sword of Honour》(12.99)和《The Lord of the Rings》(22.99)都超过了阈值。换成存在性测试,就能找出哪些书带有 ISBN:
$.store.book[?(@.isbn)].isbn
它只返回两个 ISBN 字符串、别无其他,因为过滤器只保留确实含有 isbn 键的元素——把条件取反,这正好是”找出哪些记录缺了某个字段”的常用套路。
常见问题#
$ 和 @ 有什么区别?#
$ 是文档的根,也就是你贴进来的整个 JSON 值。@ 是过滤器内部当前正在考察的节点。所以在 [?(@.price < 10)] 里,@ 指的是过滤器此刻测试的那本书;如果在那里写成 $.price,就会跳回根,去找一个根本不存在的顶层 price。
我的表达式一个都没匹配到,是 bug 吗?#
大概率不是。一条合法的表达式如果没选中任何节点,就是一次成功但结果为空的查询——比如在示例数据上跑 $.store.book[?(@.price > 1000)],只是说明没有书贵成那样,表头会显示”0 matches”而不会报错。只有表达式本身无法解析时,本页才会报错。
为什么过滤器不会执行任意 JavaScript?#
过滤器由一个专门的解析器求值,它只懂比较、布尔运算和 @ 引用,绝不会拼出代码再运行。这是刻意为之的:让你放心地把工具指向不完全信任的 JSON,同时让本页始终待在浏览器的内容安全策略之内。
JSONPath 能修改或删除节点吗?#
不能——这是一个只读查询工具,只负责选择和展示,不会改动你的 JSON。如果你要看的是两份文档之间的差异,请用 /zh-CN/json/diff/。