jq 在线测试

在浏览器里运行 jq 1.7.1:支持 -r、-s、-n、--arg 和 JSON Lines,输出、stderr 与退出码与命令行一致,报错时定位到出错位置并给出原因。

  • 在浏览器中处理
  • 数据不离开你的设备
  • 免费 · 无需注册
停止输入 0.25 秒后运行;过滤器为空时按 .(原样输出)运行。按 Ctrl+Enter(Mac 为 ⌘+Enter)立即运行。把整条命令(例如 curl … | jq -r '.items[]')粘进来,页面会提示使用其中的过滤器、选项和变量。过滤器两端带 shell 引号时可一键去掉,字符串以外的全角标点和弯引号可一键替换。import、include 和 -f 需要磁盘上的文件,这里不能用。
立即运行过滤器。输入超过 2 MB 时不随输入实时运行,要点「运行」。运行满 1 秒后按钮变成「停止」。运行超过 10 秒(每 MB 输入再加 1 秒)会被停止;repeat(1) 这类过滤器自己不会结束。
每个按钮是一个 jq 命令行选项,像给 jq 传参一样打开。-r 输出不带引号的字符串,-c 每个值一行,-s 把所有输入值读成一个数组,-n 以 null 为输入、由过滤器用 input 或 inputs 读取输入,-R 把输入按行读成文本。鼠标停在按钮上可以看到它的说明。「缩进」设置 JSON 输出的缩进(--indent n 或 --tab)。 添加一个变量,过滤器里用 $名称 读取。--arg 把值作为字符串传入;--argjson 把值按 JSON 解析,所以 10 是数字、{"a":1} 是对象。名称由字母、数字和下划线组成,不能以数字开头。名称无效或重复、--argjson 的值不是有效 JSON 时,过滤器不会运行。
2 个值
JSON、多个连续的 JSON 值(JSON Lines、NDJSON),或配合 -R 的纯文本。「打开文件」读取 200 MB 以内的 UTF-8 文件,也可以把文件拖到这一栏。超过 2 MB 的文件不在编辑框里显示,只能看到前 20,000 个字符,jq 读取的是整个文件。输入超过 2 MB 时要点「运行」才会运行。「清空」清掉输入和输出,过滤器保留。过滤器、选项、变量(名称和值)以及手动输入或粘贴的 40 KB 以内的输入会保存在本机浏览器里,下次打开时恢复;打开的文件不保存。「清空」会删除已保存的输入。
输出 jq 写到 stdout 的内容,原样显示。jq 报错时,stderr 文本显示在输出下方,退出码显示在两栏上方的状态行;「在输入中定位」「在过滤器中定位」会选中 jq 报告的位置。输出框只显示前 1 MB,256 KB 以内的 JSON 带高亮;「复制」和「下载」始终是完整输出。下载的文件名是 output.json,开了 -c 时是 output.jsonl,开了 -r 或 -j 时是 output.txt。
"A-1001"
"A-1003"
命令行 同一次运行写成的 shell 命令:把输入存成 input.json,再把命令粘到 bash 或 zsh 里执行。过滤器和变量值已按 POSIX shell 的规则加引号。「复制链接」得到的链接包含过滤器、选项和变量名;输入内容和变量值留在本机。 jq '.orders[] | select(.status == "paid") | .id' input.json

引擎:jq 1.7.1,官方 C 源码编译成 WebAssembly(jq-web 0.6.2),在本标签页的后台 worker 中运行,不上传任何内容。

示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。

例子:处理飞书开放平台的响应

飞书开放平台的调用说明写明,响应体由 code、msg、data 组成,成功时 code 为 0,并要求「请不要依据 msg 来判定一个请求是否失败」。分页接口(如搜索群列表)在 data 里返回 items、has_more 和 page_token。下面是按这个结构写的一段响应:

{"code":0,"msg":"success","data":{"items":[
  {"chat_id":"oc_a1","name":"研发周会","external":false,"chat_status":"normal"},
  {"chat_id":"oc_b2","name":"客户对接群","external":true,"chat_status":"normal"},
  {"chat_id":"oc_c3","name":"旧项目群","external":false,"chat_status":"dissolved"}],
  "page_token":"dmJCRHhpd3JR","has_more":true}}

打开 -r,过滤器 .data.items[] | select((.external | not) and .chat_status == "normal") | "\(.chat_id)\t\(.name)" 输出一行 oc_a1 研发周会:只留下内部、未解散的群。翻页脚本里取下一页标记可以用 if .data.has_more then .data.page_token else empty end。

判断成败按文档用 code。对失败响应 {"code":40004,"msg":"no dept authority error"} 打开 -e 运行 .code == 0,输出 false,退出码为 1,页面在输出旁标出「退出码 1」。shell 脚本里写 jq -e '.code == 0' resp.json > /dev/null || exit 1 即可在失败时停下。

例子:中文输入法带进来的符号

在中文标点状态下输入过滤器,很容易打出中文引号或句号:

.data.items[] | select(.name == “研发周会”) | .chat_id 在 jq 里只得到 syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?),退出码 3,不说是哪个字符。本页在过滤器下方列出字符串以外的 “ ” 、。()| 和全角字母数字,点「替换」后改成 ASCII,再运行即输出 "oc_a1"。字符串里面的中文(如 "研发周会")不会被改动。

例子:Nginx JSON 日志统计

Nginx 的 log_format 支持 escape=json(ngx_http_log_module),常见写法把每个字段都放进引号,所以状态码和耗时是字符串,每行一个 JSON:

{"status":"200","request_time":"0.012","uri":"/api/v1/orders"}
{"status":"502","request_time":"1.503","uri":"/api/v1/orders"}
{"status":"200","request_time":"0.004","uri":"/health"}
{"status":"200","request_time":"0.020","uri":"/api/v1/orders"}

打开 -n 和 -c,reduce inputs as $r ({}; .[$r.status] += 1) 逐行累加,输出 {"200":3,"502":1}。找慢请求用 select((.request_time | tonumber) > 1) | .uri(加 -r)。-n 加 inputs 一次只读一行;-s 会把整个文件读进内存。

和终端结果一致

每次运行等于 jq 选项 过滤器 input.json,input.json 是输入内容加一个结尾换行。测试用例里 71 组过滤器(选项、变量、JSON Lines、语法与运行错误、halt_error、-e、--seq、--stream)在本页引擎和 jq 1.7.1 命令行上逐字节比对 stdout、stderr 和退出码;jq 1.7.1 手册的 241 个例子中,除两个读取 $PAGER 环境变量的以外全部一致。

版本用 jq --version 查看。Ubuntu 24.04(1.7.1-3ubuntu0.24.04)、Debian 13(1.7.1-6)和 macOS 27 自带的 /usr/bin/jq(输出 jq-1.7.1-apple)是 1.7.1;Homebrew 是 1.8.2。1.7.1 保留大整数的原始写法,但一做运算就换成双精度浮点:

对雪花 ID {"id": 1830000000000000123} 运行 .id, (.id | tostring), .id + 1,前两个输出保持 1830000000000000123,第三个变成 1.83e+18。

与同类工具对比(2026-10-02 实测)

  • play.jqlang.org(jq 项目的官方 Playground,jqplay.org 现跳转到这里)在浏览器里运行 jq 1.8:trim 可用,抓包没有发现带输入内容的请求;输出与报错一起显示;repeat(1) 约 30 秒后提示 “Operation timed out”。如果你用的是 jq 1.8,用它更合适。
  • json3.com 的「jq在线运行」(cn.bing.com 搜「jq 在线」靠前)是 JavaScript 重写版:.[] | .a 对 [{"a":1},2] 只显示「无法索引 number」,不输出前面的 1;9007199254740993 变成 9007199254740992;两行 JSON Lines 报「JSON 不合法」。
  • jqkungfu.com 在本地运行 jq.wasm,同一个例子只显示 1、不显示错误;输入 JSON 有语法错误时,上一次的输出仍留在屏幕上。

限制

  • 只能读取输入这一个文件:不支持 --slurpfile、--rawfile、-f、-L、import、include,也不支持 --args / --jsonargs。
  • $ENV、env 是 WebAssembly 运行环境的固定值(HOME=/home/web_user),不是你的环境变量;now 和本地时间函数用浏览器的时钟。
  • 超过 2 MB 的输入要点「运行」;超过 2 MB 的文件不在编辑框里显示。输出超过 1 MB 时输出框截断显示,复制与下载是完整内容。
  • 运行超过 10 秒(每 MB 输入加 1 秒)会被停止;内存耗尽或递归过深时引擎自动重启。
  • 不支持彩色输出(-C)。

相关工具:JSONPath 测试器按路径取值,JSON 格式化美化 JSON,JSONL 转换器在 JSON 数组和 JSON Lines 之间转换,JSON 差异对比比较两份输出。

FAQ

这是真正的 jq,还是 JavaScript 重写的?

是 jq 1.7.1 本身:官方 C 源码经 jq-web 0.6.2 编译成 WebAssembly。页面按 jq 选项 过滤器 input.json 的方式运行它。我们的测试把 71 组过滤器的输出、错误文本和退出码与 jq 1.7.1 命令行逐字节比对,并跑通 jq 1.7.1 手册里不读取环境变量的 239 个例子。

为什么是 1.7.1,不是 1.8?

Ubuntu 24.04、Debian 13 和 macOS 自带的 /usr/bin/jq 都是 1.7.1,在这里测好的过滤器放到这些机器上结果相同。jq 1.8 新增 trim、ltrim、rtrim、trimstr、toboolean、skip、add/1、@urid 等,用到这些函数时页面会提示。

我的 JSON 会上传吗?

不会。jq 在本标签页的 Web Worker 里运行,只有首次使用时下载引擎文件(jq.wasm,压缩后约 1 MB)。分享链接只包含过滤器、选项和变量名,不包含输入内容和变量值。

页面会记住我输入的内容吗?

会,只保存在本机浏览器里。过滤器、选项、变量(名称和值)以及手动输入或粘贴的 40 KB 以内的输入会保存在本机浏览器的 localStorage 中,再次打开页面时恢复。打开的文件和更大的输入不保存。点「清空」会删除已保存的输入,过滤器在你修改前一直保留。

输入最大多少?

文件上限 200 MB。超过 2 MB 的输入不会随输入实时运行,请点「运行」。输出框只显示前 1 MB,复制和下载是完整输出。运行超过 10 秒(每 MB 输入再加 1 秒)会被停止。

这里能跑,终端里报错,是怎么回事?

多数是引号问题。请复制「命令行」框里的命令,它用单引号包住过滤器,并转义其中的单引号,这是 bash 和 zsh 需要的写法;PowerShell 与 cmd.exe 的引号规则不同。另外用 jq --version 看看版本,1.8 上个别结果不同。