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

发布于 2026/9/16 · 1 阅读
jqJSON处理器命令行工具JSON解析数据提取零依赖Windows开源软件Shell脚本数据处理
jq 是轻量灵活的命令行 JSON 处理器,用纯 C 编写、零运行时依赖,常被称作 JSON 领域的 sed 与 awk。本文介绍 jq-1.8.2 的安全修复与用法,并附 Windows 可执行文件及中文文档。

封面.png

1. jq 简介

jq 是一个命令行 JSON 处理器,用作者自己的话说,它是 JSON 数据领域的 sedawkgrep。它由 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_setpathjv_getpathjv_delpaths 的栈溢出(CVE-2026-33947);限制包含关系检查深度,修复 contains 的栈溢出(CVE-2026-40612);限制递归对象合并深度(CVE-2026-43896);检测循环模块导入(CVE-2026-44777);为深层结构相等性与比较的递归加上防护(CVE-2026-47770,CVSS 5.5);限制函数参数与定义的个数以防段错误;避免释放深层嵌套值时栈溢出。
  • 内存越界类:修复 jvp_string_appendjvp_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);修复 tonumbertoboolean 未拒绝含内嵌空字节字符串的问题。
  • 资源与稳定性类:随机化哈希种子,缓解哈希碰撞发起的拒绝服务攻击(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
└── LICENSE

4. 安装

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 的前提,否则每次都得输入完整路径。

推荐放在用户目录下,避免动到系统盘权限:

  1. 在资源管理器的地址栏输入 %USERPROFILE% 回车,进入当前用户目录。
  2. 新建一个名为 bin 的文件夹(若已存在则跳过),把重命名后的 jq.exe 放进去,例如 C:\Users\你的用户名\bin\jq.exe
  3. Win 键搜索"环境变量",选择"编辑账户的环境变量"。
  4. 在"用户变量"区域选中 Path,点击"编辑",再点"新建",填入 C:\Users\你的用户名\bin,逐层确定保存。
  5. 关闭并重新打开命令行窗口(已打开的窗口不会读取新变量),执行 jq --version 验证。

命令成功时输出形如 jq-1.8.2。如果提示"不是内部或外部命令",多半是路径填错或没有重开命令行窗口。

若使用 winget 或 Chocolatey 等包管理器,也可以直接安装并由它们自动配置 PATH,命令分别是 winget install jqlang.jqchoco install jq。本整合包提供的是免安装的独立可执行文件,适合无法联网或不便使用包管理器的环境。

5. 使用

jq 的调用形式是 jq '过滤器表达式' [文件]。不指定文件时从标准输入读取,因此最常通过管道接收其他命令的输出。

5.1 格式化与美化输出

把压缩成一行的 JSON 展开成带缩进的易读结构,过滤表达式写成 .(恒等过滤器)即可:

jq . data.json
curl -s https://api.example.com/user | jq .

若想输出紧凑的单行 JSON,加 -c

jq -c . data.json

5.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.json

5.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.json

5.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