JSONPath 与 jq 查询
面对一段又长又深的 JSON,肉眼找一个字段、一层数组往往比想象中费劲。这个工具把两套业内最常用的查询语言放在同一个页面:JSONPath 负责“取值”,用 $.store.book[*].author 这样的路径精准挑出你要的节点;jq 负责“变换”,能过滤、映射、聚合,写出接近编程的管道。左边贴 JSON,底部输入表达式,右边即时刷新结果,并实时告诉你命中了几条。默认的 JSONPath 无需加载、秒开即用,切到 jq 时才按需拉取 wasm 引擎。全部在你的浏览器本地运行,粘进来的数据不会离开这个标签页。
- JSONPath 与 jq 双引擎同页切换:一个负责精准取值,一个负责过滤、映射与聚合,覆盖从简单挑字段到复杂变换的全部场景
- 输入即出结果,改 JSON 或改表达式都会防抖后立即刷新,并明确标出命中条数,区分“零匹配”和“语法出错”
- JSON 解析错误与查询语法错误分开提示,各自定位到输入或表达式,绝不悄悄吐出残缺或空白结果
- 默认 JSONPath 秒开无需加载,jq 引擎仅在你切换过去时才按需下载并缓存,整个过程都在浏览器本地完成,数据不出本机
JSONPath 与 jq 语法速查
不熟悉这两种语法也不要紧。下面两张表列出最常用的符号与函数,配上作用说明和可直接套用的示例——照着改成你自己的字段,几分钟就能上手。
JSONPath 常用语法
$ $ @ @.price .name $.store .. $..author * $.store.* [n] $..book[0] [a:b] $..book[0:2] [?(expr)] $..book[?(@.price < 10)] ['a','b'] $..book[0]['title','price'] jq 常用语法
. . .foo .store .a.b .store.bicycle.color .[] .store.book[] | .store.book[] | .title select(cond) .store.book[] | select(.price < 10) map(f) .store.book | map(.price) add / length [.store.book[].price] | add sort_by(f) .store.book | sort_by(.price) 功能简介
一个查询工具好不好用,取决于它能不能让你看清结果、也看清错误。这个工具围绕这两点搭建:即时的结果、可信的命中计数,以及把输入问题和表达式问题分得清清楚楚的提示。
- 01
双引擎,各司其职
JSONPath 擅长按路径取值,语法简洁、上手快;jq 是功能完整的 JSON 处理器,能过滤、映射、聚合乃至重组结构。同一页面一键切换,简单挑字段和复杂变换都不用换工具。
- 02
输入即出结果
不需要点任何“运行”按钮。无论你改动 JSON 还是改动表达式,结果都会在防抖后立即刷新,边写边看,探索一段陌生数据的结构快得多。
- 03
可信的命中计数
每次查询都会标出命中了几条,让你一眼看出结果是一条、多条还是空。空结果会明确显示“无匹配”,而不是留一片让人猜的空白。
- 04
错误分层提示
JSON 本身解析不了,会定位到输入面板;表达式写错了,会定位到查询栏并附上引擎的原始报错。两类问题分开呈现,你能立刻知道该改哪一边。
- 05
缩进与紧凑随手切换
结果既能按多行缩进展开、方便逐层阅读,也能压成单行紧凑形式、方便直接复制进代码或命令。两种形态一键切换。
- 06
一键复用与导出
内置一份经典的书店 JSON 与由浅入深的示例表达式,点一下就能套用;结果可一键复制或下载为 .json 文件,衔接到下一步。
如何使用
从一段陌生的 JSON 到你要的那部分数据,几步就能完成,全程结果和命中数都摆在眼前。
- 01
把 JSON 粘贴到左侧输入面板,或点“示例”载入一份现成的书店数据练手。
- 02
在底部选择查询语言:只想取值就用 JSONPath,需要过滤、计算或重组就切到 jq。
- 03
在查询栏输入表达式,或直接点下方的示例表达式套用,右侧会即时刷新结果并标出命中条数。
- 04
用“缩进/紧凑”调整结果形态,再一键复制或下载为 .json,接入你的代码、脚本或文档。
功能说明
一些让结果值得信任、也用得顺手的细节。
- JSONPath 由成熟的 jsonpath-plus 提供,支持递归下探、通配、过滤表达式与数组切片等完整语法。
- jq 采用官方 jq 编译成的 WebAssembly 版本,语法与命令行 jq 完全一致,你在终端里怎么写,这里就怎么写。
- 查询随输入即时执行,没有“运行”按钮,也没有改完表达式还要再等一下的延迟。
- JSON 解析错误与查询语法错误分别就地显示原始信息,而不是默默给出空结果或残缺输出。
- 一切都在浏览器本地运行,你粘贴的 JSON——包括线上接口返回的敏感数据——都不会被上传或记录,关掉标签页即消失。
适合哪些场景
这些场景里,一条查询能省下大量翻找的时间。
-
调试接口返回
接口返回一大坨嵌套 JSON,想确认某个字段到底藏在哪、值对不对,一条路径就能把它挑出来,不必在编辑器里一层层折叠展开。
-
从数据里做统计
想知道一批记录里价格的合计、去重后的作者名单、或某个数组的长度,用 jq 一行管道就能算出来,比写临时脚本快得多。
-
验证与调试表达式
在把 JSONPath 或 jq 写进代码、CI 脚本或日志管道之前,先在这里对着真实数据试一遍,确认它匹配到的正是你想要的那些节点。
-
理解陌生的数据结构
拿到一份没有文档的 JSON,用 $.. 递归下探、用通配符扫一层,边写边看结果,能快速摸清它的层级和字段分布。
JSONPath 与 jq,分别适合什么
两者都在 JSON 上工作,但出发点不同:JSONPath 是“查询”,只负责把你要的节点挑出来;jq 是“处理”,可以在挑出来之后继续加工。理解这条分界线,就知道每次该用哪一个。
-
JSONPath:按路径取值
它借鉴 XPath 的思路,用一条路径描述你要的节点。$ 是根,. 逐层深入,取出的永远是原文档里已有的值,不做任何改写。想“把某处的数据挑出来”,它最直接。
-
JSONPath 的核心符号
$ 表示根节点,.. 表示递归下探到任意深度,* 是通配符匹配同层全部,[?(@.price < 10)] 是过滤表达式,[-1:] 这类切片按位置截取。几个符号组合起来就能覆盖绝大多数取值需求。
-
jq:把 JSON 当数据流处理
jq 是一门小巧但完整的语言。它把 JSON 看作在管道 | 中流动的值,每一段过滤器加工上一段的输出,可以取值、筛选、改形状,也可以计算。想“取出来之后再算点什么”,它才是答案。
-
jq 的常用能力
map 对数组逐项变换,select 按条件筛选,add 求和,unique 去重,length 求长度,max_by 取极值。把它们用管道串起来,就能一行写出统计、重组、汇总这类 JSONPath 做不到的事。
-
一个负责选,一个负责算
简单地说:只是想“把某个值找出来”,JSONPath 更短更直观;想在找出来之后“再过滤、再计算、再换个结构”,就交给 jq。这也是本工具把两者并排放在一起的原因。
-
结果为什么是一组值
两种引擎的输出天然都是“一组值”:JSONPath 匹配到的所有节点、jq 流出的每一个结果。所以工具会告诉你命中几条,并把它们按你选的缩进或紧凑形式一并列出。
使用建议
一些让查询既准确又高效的习惯。
- 先想清楚是“取值”还是“变换”:只要挑出已有节点就用 JSONPath,需要筛选、计算或改结构再上 jq,别用错工具把简单事写复杂。
- 善用递归下探。JSONPath 的 .. 和 jq 的 .. 都能跨层级搜索,面对结构不确定的数据时,比逐层写死路径更省心也更健壮。
- 用命中计数当校验。写完表达式先看命中几条,和你预期的数量对不上,往往就是路径或条件写偏了。
- 把结果切成紧凑形式再复制进代码或命令行,多行缩进则留给需要逐层阅读、核对的时候。
- 在这里验证通过后再把表达式落地到代码或脚本里。工具用的就是标准的 jsonpath-plus 与官方 jq,行为和线上一致。
边界与注意事项
这个工具做什么,又把什么留给别的步骤。
- 它针对单个 JSON 文档做查询,不做多文件合并,也不会去请求 URL 里引用的外部数据。
- 它专注于查询与变换,不是完整的 JSON 编辑器;大段结构性的改写、格式化排版请用相应的格式化工具。
- JSONPath 的实现遵循 jsonpath-plus 的语法,个别扩展写法在不同实现间可能有差异,以本工具的结果为准。
- 无法解析的 JSON 会被如实报错而不是自动修复,因此严重损坏的输入不会产生半对半错的结果。
常见问题
关于 JSONPath、jq,以及这个工具怎么用的常见问题。
JSONPath 和 jq 有什么区别,我该用哪个?
一句话:JSONPath 负责“取值”,jq 负责“处理”。如果你只是想把 JSON 里某个位置的节点挑出来,JSONPath 的路径语法最短最直观,比如 $.store.book[*].author。如果你还要在挑出来之后做过滤、求和、去重、改结构这类加工,就需要 jq——它是一门完整的 JSON 处理语言。工具把两者放在同一页,正是让你按需要随手切换。
我可以直接用命令行 jq 的写法吗?
可以。这里的 jq 是官方 jq 编译成的 WebAssembly 版本,语法与命令行完全一致,管道、内置函数、select、map、reduce 等都照常可用。你在终端里怎么写,粘到这里就怎么跑,无需任何改动。
为什么切到 jq 时会有一个加载过程?
JSONPath 体积很小且同步运行,所以是默认引擎,打开即用、无需等待。jq 是一个约 1MB 的 WebAssembly 引擎,只有在你第一次切换到 jq 时才会按需下载,之后本次访问都会走缓存。这样只用 JSONPath 的访客就完全不必为 jq 付出加载成本。
结果里的“命中 N 条”是什么意思?
它表示当前表达式匹配或产出的值有几个。JSONPath 会把所有符合路径的节点收集成一组,jq 则会输出一串结果值,这个数字就是它们的数量。命中 0 条时会显示“无匹配”,帮助你区分“确实没有符合的数据”和“表达式写错了”。
我的 JSON 会被上传吗?
不会。所有解析和查询都在你的浏览器里完成,粘贴的 JSON 和查询结果都不会被传输或存储,关闭标签页后即消失。因此即便是线上接口返回的敏感数据,也可以放心在这里调试。
为什么表达式写错了,之前的结果还留着?
这是刻意的设计。当查询出现语法错误时,工具会在结果区给出引擎的原始报错,而不是把你上一次的可用结果直接清空。这样你在连续调整表达式时不会来回“闪烁”,改对了结果自然就回来了。
JSON 无效时会怎样?
如果左侧的 JSON 本身无法解析,工具会在输入面板下方标出解析错误的具体信息,并暂不执行查询——因为对一段无法解析的数据谈匹配没有意义。先按提示修正 JSON,查询会立刻恢复。