jql:一个刻意不模仿 jq 的 JSON 查询 CLI
JSON 查询语言 CLI 工具。分隔符 组分隔符 组分隔符从子查询构建一个数组。
秒懂
- 它是什么?
- jql 用 Rust 实现,以组分隔符、镜头选择器和管道操作符组织查询语法。它明确不打算对齐 jq,本文基于 README 和仓库结构,说明它适合谁、不适合谁。
- 适合谁用?
- 适合需要轻量、快速且语法自成一派的 JSON 提取任务的开发者,尤其是已经在用 Alpine、Fedora、FreeBSD 等包管理器且不想装 jq 生态的人。不适合依赖 jq 成熟生态、需要复杂过滤或变换逻辑的用户,因为 jql 明确不打算对齐 jq,也没有提供类似 jq 的完整函数库。
- 能商用吗?
- 可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 12 天前。
- 用什么语言写的?
- 主要是 Rust(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月20日)和我们的分析,不构成法律意见。
开源项目深度解析
它解决什么问题,写给谁
jql 是一个用 Rust 写的 JSON 查询命令行工具,发音是 jackal。它解决的是从 JSON 输入中按路径提取数据的问题,输入输出都是 JSON。目标用户是需要在终端里快速取字段、取数组元素、拍平嵌套结构的开发者。它强调轻量、快速、特性简单、避免冗余。和 jq 不同,它不打算覆盖所有 JSON 处理场景,README 里直接写了非目标:没有计划对齐 jq 或任何类似工具。这意味着你得到的是一套独立的查询语法,不是 jq 的简化版。
查询语法:组分隔符与镜头选择器
查询由 token 序列组成,键选择器必须双引号,这是为了完全符合 JSON 规范。组分隔符用逗号把子查询包在花括号里,构建数组。例如对 {"a":1,"b":2,"c":3} 执行 '"a","b","c"',输出 [1,2,3]。镜头选择器是特色,用 |={...} 形式,可以组合多个选择器加可选值来过滤对象。README 给的例子里,|={"b""d"=2, "c"} 能从数组里挑出 b.d 等于 2 或包含键 c 的对象。这个语法比 jq 的 select 更紧凑,但代价是学习曲线陡,初见时不容易猜到含义。
数组与对象的索引、范围和拍平
数组支持索引选择器 [2,1] 按任意顺序取,输出 [3,2];范围选择器 [2:1] 是逆序的,[:2] 无下界,[0:] 无上界。对象同样有索引选择器 {2,0} 和范围选择器 {2:1},输出保持对象结构。拍平操作符 .. 对数组递归展开,对对象则把嵌套键合并成点号路径,例如 {"a":{"c":false},"b":{"d":{"e":{"f":1}}}} 变成 {"a.c":false,"b.d.e.f":1}。这个行为在 jq 里没有直接对应,是 jql 自己的设计。注意拍平会丢弃中间层的空对象,只保留叶子值。
管道操作符:并行与截断
管道入操作符 |> 把后续 token 并行应用到数组每个元素上。比如 '"a"|>"b""c"' 对 a 数组里每个对象的 b.c 取值,输出 [1,2]。管道出操作符 <| 停止并行化,回到单值模式,例子 '"a"|>"b""c"<|[1]' 在并行结果上取索引 1,输出 2。截断操作符 ! 把输出映射成简单 JSON 原始类型,布尔、null、数字、字符串、空数组或空对象。对 {"a":[1,2,3]} 执行 '"a"!' 输出 [],因为数组被截断成空数组。这个操作符适合只关心结构类型、不关心具体值的场景。
安装与日常用法
安装途径很多:Alpine 用 apk add jql,Arch 用 yay -S jql,Fedora 用 dnf install jql,FreeBSD 用 pkg install jql,Homebrew 用 brew install jql,Nix 用 nix-env -i jql,也可以 cargo install jql 或 cargo binstall jql。GitHub release 提供编译好的二进制。基本用法是 jql '查询' 文件,或 cat 文件 | jql '查询'。输出默认 pretty print,-i 改成单行;-r 去掉字符串外面的双引号;-q 从文件读查询;-s 支持逐行流式读取,README 特别说明这只针对完整 JSON 行,比如 Docker logs --follow,不是用来读超大单条输入。
验证模式与工作区结构
-v 标志只做 JSON 合法性校验,返回对应退出码,不做提取。这个功能适合脚本里先验输入再处理。项目是 workspace,拆成三个 crate:jql 是二进制,jql-parser 和 jql-runner 是库,分别负责解析和运行查询。文档说 jql-parser 和 jql-runner 有独立的 docs.rs 页面,意味着你可以把解析和运行逻辑嵌进自己的 Rust 程序,不一定要走 CLI。开发命令用 justfile,需要 cargo-nextest 和 just。仓库里没有提供性能基准的完整数据,README 只提到有 benchmark 相关段落,但被截断了,具体数字无从确认。
限制与替代方案
最明显的限制是语法独特性。键必须双引号,查询要包单引号或转义内部双引号,这对习惯 jq 的 .a.b 写法的人是个门槛。镜头选择器和组分隔符的组合在复杂查询时容易写错,且错误信息是否足够友好,README 只承诺了 meaningful error messages,没有展示具体例子。另一个限制是流式模式的范围:它只能处理逐行完整的 JSON,不能处理超大单条流。替代方案自然是 jq,jq 用 . 开头路径、select 过滤、map 映射,函数库庞大,支持管道和变量。jql 和 jq 的差异不在能力大小,而在设计取向:jq 追求表达式完备性,jql 追求 token 最小化和输出始终是 JSON。如果你的查询逻辑复杂到需要 if-then-else 或自定义函数,jql 没有对应物。
维护与许可证
许可证是 Apache-2.0,可以自由使用、修改、分发,只要保留版权声明。仓库最后推送是 2026 年 3 月 18 日,同一天发布了 8.1.0、8.1.1、8.1.2 三个版本,说明维护活跃,但版本号密集也可能意味着 API 在快速变动。jql-parser 和 jql-runner 作为库,如果被外部项目依赖,升级时要留意 semver 是否严格。README 没有提供迁移指南或变更日志链接,升级成本无法从现有材料评估。包管理器覆盖广是优点,但各发行版打包版本可能滞后于 crates.io 最新版,用 apk 或 dnf 装的可能不是 8.1.2。
编辑结论
适合需要轻量、快速且语法自成一派的 JSON 提取任务的开发者,尤其是已经在用 Alpine、Fedora、FreeBSD 等包管理器且不想装 jq 生态的人。不适合依赖 jq 成熟生态、需要复杂过滤或变换逻辑的用户,因为 jql 明确不打算对齐 jq,也没有提供类似 jq 的完整函数库。采用前先验证三件事:你的查询是否都能用双引号键选择器表达,是否接受输出总是 JSON 格式(除非用 -r 去掉字符串引号),以及是否愿意接受流式模式只针对逐行完整 JSON 而非超大单条输入的限制。若你的工作流高度依赖 jq 的过滤器,jql 大概率是错误工具。
社区笔记