jq 在线测试

贴一段 JSON,输入 jq 表达式即时出结果;常用语法全覆盖,不支持的明确说。

jq 是命令行 JSON 事实上的查询标准,但写表达式时最烦的不是记语法,而是「这条到底输出什么」:迭代会不会把对象拍平、select 的条件里能不能访问外层字段。本页面把 jq 搬进浏览器:左边贴 JSON,右边输入表达式,结果即时渲染成 JSON,改一个字符立即重算。

实现是手写的 jq 子集求值器,覆盖日常 90% 的查询:路径与迭代(. .foo .[] ..)、select/map、管道与逗号、对象构造、比较与算术、二十余个内建函数。刻意做小换来的是诚实:子集之外的语法(变量、def、reduce)会明确提示「不支持」,而不是给一个看似可信的错误结果。

一切皆是流

jq 的心智模型是「过滤器吃一个输入,吐零或多个输出」:.users[] 把数组拆成三个输出,select 把不满足的过滤成零个,[..] 再把流收拢成数组。页面上每个表达式显示的就是这条流物化后的结果,条数会明确标出——理解了「流」,大部分 jq 表达式都能读懂。

对象构造是反查的利器

{count: .meta.total, names: [.users[].name]} 这类构造表达式,能把散落的字段重组成前端需要的形状,是后端到前端的数据裁剪常用手段。简写 {foo} 等价于 {foo: .foo},从对象挑字段时比全称少敲一半。

常见问题

支持哪些语法?
页面底部的速查列了完整清单:路径、迭代、管道、逗号、// 默认值、and/or/not、比较、算术、对象与数组构造,以及 select/map/keys/has/add/sort/unique/join/split/to_entries 等内建。变量 $x、def、reduce、if、字符串插值不在子集内,会明确报不支持。
与命令行 jq 的结果完全一致吗?
在子集覆盖的表达式内语义一致(求值模型就是流)。数值精度、排序细节遵循 JavaScript 与 jq 的公共语义,极端边界(超大整数、对象键排序)以命令行为准。
JSON 会上传吗?
不会。求值器跑在浏览器里,没有网络请求,接口响应、日志这类敏感 JSON 可以放心贴。

相关工具