jq 在线测试
在浏览器里运行 jq 1.7.1:支持 -r、-s、-n、--arg 和 JSON Lines,输出、stderr 与退出码与命令行一致,报错时定位到出错位置并给出原因。
- 在浏览器中处理
- 数据不离开你的设备
- 免费 · 无需注册
用微信扫描以下二维码即可分享
示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。
例子:处理飞书开放平台的响应
飞书开放平台的调用说明写明,响应体由 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 上个别结果不同。