Windows 下载、安装 jq 1.8.2,轻量灵活的 JSON 命令行处理器(附安装包jq-win64.exe)
文章目录

1. jq 简介
jq 是一个命令行 JSON 处理器,用作者自己的话说,它是 JSON 数据领域的 sed、awk、grep。它由 Stephen Dolan 创建,2012 年 7 月首次发布在 GitHub 上。最早的原型用 Haskell 写成,后来为了追求可移植性和零运行时依赖,被重写为纯 C 语言实现——这个决定让 jq 得以进入几乎所有操作系统的软件源,也让它成为无数人的"装机必备"。
jq 的发展并非一路顺遂。2018 年 11 月发布 1.6 之后,项目沉寂了近五年,社区一度担忧它会就此停更。2023 年情况出现转机:项目迁移到独立的 jqlang 组织,原仓库从 Stephen Dolan 名下转出,一批新维护者接手,随后发布了等待已久的 1.7 版本。此后节奏恢复稳定,1.7.1(2023 年 12 月)、1.8.0(2025 年 6 月)、1.8.1(2025 年 7 月)陆续发布。截至 2026 年 9 月,jq 在 GitHub 上拥有约 3.56 万颗星标、1800 余个 Fork,是 JSON 处理领域事实上的标准工具。
jq 的工作方式是"过滤器"(filter):你把 JSON 从文件或管道喂给它,再写一段表达式描述"我要什么",它就输出结果。表达式语法接近 JSON 本身,.name 取字段、.users[] 展开数组、select(...) 过滤、map(...) 映射,用 | 串联起来可以完成相当复杂的变换。它不依赖任何第三方库,跨平台行为一致,因此特别适合放进 shell 脚本、CI 流程和运维自动化里。
核心特点:
- 纯 C 实现、零运行时依赖:单个可执行文件即可运行,不依赖任何解释器或动态库,拷贝到任何机器都能直接用。
- 语法贴近 JSON:表达式写法与 JSON 本身高度相似,
.foo.bar、.[0]、.[]这些记法几乎不需要额外记忆成本。 - 管道式组合:可以用
|把多个过滤器串起来,像搭积木一样逐步完成"筛选—变换—重组"。 - 完整的 JSON 处理能力:支持切片、映射、过滤、排序、分组、归约、字符串插值、正则匹配、日期时间运算、base64 编解码等。
- 内建格式化输出:默认带缩进与语法高亮,
jq .一个命令就能把压缩成一行的 API 响应变成可读结构。 - 跨平台一致:Windows、Linux、macOS 以及各类 BSD、Solaris 上的行为完全一致,脚本可以原样迁移。
- 生态广泛:几乎所有 Linux 发行版的软件源都收录了 jq,Kubernetes、AWS CLI、Azure CLI 等工具的文档里也大量使用 jq 作为示例。
2. jq-1.8.2 版本亮点
该版本汇集了 23 位贡献者 的 86 条 贡献。
jq-1.8.2 于 2026 年 6 月 20 日发布,距 1.8.1 将近一年。这是一个以安全修复为核心、同时修补大量缺陷的补丁版本,共修复了 16 个 CVE 编号漏洞 和 2 个 GitHub 安全公告(GHSA)。官方明确建议所有使用 jq 处理不可信 JSON 输入的场景尽快升级到 1.8.2 或更高版本。
安全修复(本版本重点):
这一批漏洞大多与"深层嵌套结构导致递归失控"有关,属于典型的拒绝服务(DoS)风险——攻击者只要构造一段精心嵌套的 JSON,就可能让 jq 崩溃甚至越界读写内存:
- 栈溢出类:限制路径深度,修复
jv_setpath、jv_getpath、jv_delpaths的栈溢出(CVE-2026-33947);限制包含关系检查深度,修复contains的栈溢出(CVE-2026-40612);限制递归对象合并深度(CVE-2026-43896);检测循环模块导入(CVE-2026-44777);为深层结构相等性与比较的递归加上防护(CVE-2026-47770,CVSS 5.5);限制函数参数与定义的个数以防段错误;避免释放深层嵌套值时栈溢出。 - 内存越界类:修复
jvp_string_append与jvp_string_copy_replace_bad中的堆缓冲区溢出(CVE-2026-32316);修复jv_parse_sized()的越界读取(CVE-2026-39979);修复原始文件加载(--rawfile)中的堆缓冲区溢出(CVE-2026-49839);修复args2obj()数组参数路径中的释放后使用问题(GHSA-gf4g-95wj-4q4r);修复tokenadd中的有符号整数溢出(GHSA-hj52-j2c9-r8r4);修复 base64 解码表中一字节的越界读取。 - 解析与截断类:修复 JSON 解析器中的 NUL 截断(CVE-2026-33948);修复用
-f加载的程序文件中的 NUL 截断(CVE-2026-41256);拒绝模块导入路径中内嵌的 NUL 字节(CVE-2026-43895);修复tonumber与toboolean未拒绝含内嵌空字节字符串的问题。 - 资源与稳定性类:随机化哈希种子,缓解哈希碰撞发起的拒绝服务攻击(CVE-2026-40164);拒绝长度超过
DEC_MAX_DIGITS的数字字面量(CVE-2026-43894);收紧字符串长度边界并在implode中传播无效值(CVE-2026-54679);修复stack_reallocate的有符号整数溢出(CVE-2026-41257);为字符串解析器预分配tokenbuf以避免未定义行为;修复多处内存泄漏与重复释放。
新增构建产物:
- 新增 Windows arm64 构建(
jq-windows-arm64.exe),Windows on ARM 设备不再需要靠模拟运行 x64 版本。 - Docker 镜像新增 arm/v7 架构支持。
- 新增发布证明(attestation)包
jq-attestation.json,其 SHA-256 记录在sha256sum.txt中。官方说明提到可用gh attestation verify --bundle jq-attestation.json直接校验所下载二进制的来源,无需额外认证。
命令行改进:
- 最大打印深度从 256 提升到 10000,此前处理超深嵌套数据时会被截断。
- 改进带闭合分隔符的错误信息截断方式;移除
die函数输出中多余的空格。 - 修复
-r(原始输出)标志会破坏多字节字符的问题。 - 修复重复导入同一个有错误的模块时崩溃的问题。
既有函数修复:
- 修复
rtrimstr("")总是返回""的问题。 - 修复
del(.[nan])的死循环与未定义行为。 - 重构
@uri与@urid,修复多字节 UTF-8 被破坏的问题。 - 修复 32 位平台上的 2038 年问题。
- 在
from_entries的定义中把//=改为//。 - 修复
f_env边界检查中指针相减顺序颠倒、f_strflocaltime缺失有效性检查等问题。
构建与文档:
- 新增 Solaris 平台支持。
- 支持
--disable-maintainer-mode构建以及源码目录与构建目录分离的构建方式。 - 生成 man 手册页时遵循
SOURCE_DATE_EPOCH,便于可复现构建。 - 修复文档中的若干拼写错误与教程按钮交互问题。
3. 获取安装包
如果访问 GitHub 不便,安装包及中文文档:https://hanshuixin.org/go/226B(内含 jq-win64.exe、README 中英对照、发布说明中英对照、LICENSE 和源码)。
jq 其他版本:https://hanshuixin.org/resource/software_integrated_package/Windows/jq
Windows安装jq-1.8.2(jq-win64).zip
├── jq-win64.exe
├── Windows安装jq-1.8.2(jq-win64).pdf
├── README/
│ ├── README.md
│ └── README-中文版.md
├── 发布说明/
│ ├── RELEASE-NOTES.md
│ └── RELEASE-NOTES-中文版.md
├── 源码/
│ └── jq-1.8.2.zip
└── LICENSE4. 安装
jq 无需安装。整合包根目录中的 jq-win64.exe 就是完整的程序本体——它是一个静态链接的独立可执行文件,不依赖任何运行库,双击即可在命令行中运行,不会写入注册表,也不会在系统中留下残留。
这个文件名带 win64,对应的是 64 位 Windows(x64)。如果你的设备是 Windows on ARM,同一版本另有 jq-windows-arm64.exe 可用;32 位系统则对应 jq-windows-i386.exe。本整合包所附的 jq-win64.exe 与官方 jq-windows-amd64.exe 的 SHA-256 校验值完全相同,是同一份构建产物。
建议把 jq-win64.exe 重命名为 jq.exe,以便在命令中直接输入 jq。
4.1 把 jq 加入 PATH
jq 是命令行工具,要让它在任意目录下都能直接调用,需要把它所在的目录加入系统 PATH 环境变量。这一步是使用 jq 的前提,否则每次都得输入完整路径。
推荐放在用户目录下,避免动到系统盘权限:
- 在资源管理器的地址栏输入
%USERPROFILE%回车,进入当前用户目录。 - 新建一个名为
bin的文件夹(若已存在则跳过),把重命名后的jq.exe放进去,例如C:\Users\你的用户名\bin\jq.exe。 - 按
Win键搜索"环境变量",选择"编辑账户的环境变量"。 - 在"用户变量"区域选中
Path,点击"编辑",再点"新建",填入C:\Users\你的用户名\bin,逐层确定保存。 - 关闭并重新打开命令行窗口(已打开的窗口不会读取新变量),执行
jq --version验证。
命令成功时输出形如 jq-1.8.2。如果提示"不是内部或外部命令",多半是路径填错或没有重开命令行窗口。
若使用 winget 或 Chocolatey 等包管理器,也可以直接安装并由它们自动配置 PATH,命令分别是
winget install jqlang.jq和choco install jq。本整合包提供的是免安装的独立可执行文件,适合无法联网或不便使用包管理器的环境。
5. 使用
jq 的调用形式是 jq '过滤器表达式' [文件]。不指定文件时从标准输入读取,因此最常通过管道接收其他命令的输出。
5.1 格式化与美化输出
把压缩成一行的 JSON 展开成带缩进的易读结构,过滤表达式写成 .(恒等过滤器)即可:
jq . data.json
curl -s https://api.example.com/user | jq .若想输出紧凑的单行 JSON,加 -c:
jq -c . data.json5.2 提取字段
按层级用点号取字段,数组下标用方括号:
jq '.name' data.json
jq '.user.profile.age' data.json
jq '.items[0]' data.json
jq '.items[-1]' data.json字符串结果默认带引号,加 -r 输出不带引号的原始文本,便于拼进 shell 变量:
jq -r '.name' data.json字段可能不存在时,用 // 提供默认值:
jq '.nickname // "匿名"' data.json5.3 过滤与转换数组
.[] 展开数组元素,select() 按条件筛选,map() 对每个元素做变换,三者都能用 | 串联:
# 列出所有元素
jq '.users[]' data.json
# 筛选出年龄大于 28 的元素
jq '.users[] | select(.age > 28)' data.json
# 只提取筛选结果的姓名
jq -r '.users[] | select(.active == true) | .name' data.json
# 对整个数组做映射
jq '.users | map({name: .name, age: .age})' data.json
# 排序、取前若干项
jq '.users | sort_by(.age) | .[0:5]' data.json常用的还有 length(长度)、keys(键列表)、unique(去重)、group_by(...)(分组)、add(求和/拼接)。
5.4 修改与构造 JSON
jq 不只是"读",也能生成新的 JSON 结构:
# 新增或覆盖字段
jq '. + {"email": "user@example.com"}' data.json
# 修改嵌套字段的值
jq '.user.age = 30' data.json
# 删除敏感字段
jq 'del(.password, .token)' data.json
# 用对象/数组构造器重组结构
jq '{name: .user.name, tags: [.tags[] | select(. != "")]}' data.json
# 转换输出为 CSV
jq -r '.users[] | [.name, .age] | @csv' data.json5.5 常用命令行参数
| 参数 | 说明 |
|---|---|
-r |
输出原始字符串,不带 JSON 引号 |
-c |
输出紧凑的单行 JSON |
-s |
把输入流整体读成一个数组再处理 |
-n |
不读取输入,直接按表达式构造 JSON |
-e |
依据输出结果设置退出码,便于在脚本中判断 |
-f 文件 |
从文件中读取过滤器表达式,适合复用较长的脚本 |
--arg 名 值 |
从 shell 向表达式传入字符串变量 |
--argjson 名 值 |
从 shell 向表达式传入 JSON 值 |
-S |
输出时对对象的键排序 |
--tab |
用制表符代替空格做缩进 |
传参的典型写法如下,注意表达式里用 $name 引用传入的变量:
name="alice"
jq --arg name "$name" '.users[] | select(.name == $name)' data.json