jqlang/jq 1.7 使用手册:JSON处理利器详解
【免费下载链接】jq Command-line JSON processor 项目地址: https://gitcode.com/gh_mirrors/jq/jq
一、jq核心概念与基础用法
jq是一个轻量级且功能强大的命令行JSON处理器,它通过过滤器(filter)机制实现对JSON数据的转换和处理。理解jq的核心概念是掌握它的关键:
1.1 过滤器模型
jq程序本质上是由过滤器组成的管道。每个过滤器都遵循简单的输入-输出模型:
- 接收JSON数据作为输入
- 处理后产生输出结果
- 多个过滤器可以通过管道符号
|连接
这种设计使得复杂的数据转换可以通过组合简单的过滤器来实现,而不需要传统的循环和迭代结构。
1.2 基础过滤器类型
-
恒等过滤器
.:最简单的过滤器,原样输出输入数据echo '{"name":"Alice"}' | jq '.' -
字段选择器
.field:提取对象中的特定字段echo '{"name":"Alice","age":30}' | jq '.name' -
安全字段选择器
.field?:当字段不存在时返回null而不报错
二、jq命令行使用详解
2.1 基本调用语法
jq的基本命令格式为:
jq [选项] <过滤器> [文件...]
当不指定文件时,jq会从标准输入读取数据。多个JSON值可以用空格分隔输入。
2.2 常用选项解析
输入控制选项
-n/--null-input:不使用输入数据,以null作为输入-R/--raw-input:不解析输入为JSON,按原始文本处理-s/--slurp:将所有输入合并为数组后处理
输出格式化选项
-c/--compact-output:紧凑输出(单行)-r/--raw-output:直接输出原始字符串(去除JSON引号)-S/--sort-keys:按键名排序后输出对象
特殊处理选项
--stream:流式处理大型JSON文档--arg:传递字符串参数给jq程序--argjson:传递JSON参数给jq程序
三、核心过滤器深度解析
3.1 对象操作过滤器
-
标准字段访问
.user.name -
动态字段访问 对于包含特殊字符的字段名:
.["user-name"] -
多字段选择
{name: .user.name, age: .user.age}
3.2 数组操作过滤器
-
数组迭代
.[] | .name -
数组构造
[.users[].name] -
数组索引
.users[0]
3.3 管道操作
jq的强大之处在于可以串联多个过滤器:
.users[] | select(.age > 18) | {name, age}
四、高级特性与最佳实践
4.1 条件与逻辑运算
if .age >= 18 then "adult" else "child" end
4.2 自定义函数
def greet($name): "Hello, \($name)!";
.greeting = greet(.user.name)
4.3 错误处理
使用try-catch结构处理潜在错误:
try .invalid_field catch "Field not found"
4.4 大型文件处理技巧
对于超大JSON文件,使用流式处理:
jq --stream '...' huge-file.json
五、实用示例集锦
5.1 数据提取
curl https://api.example.com/users | jq '.[] | {id, name}'
5.2 数据转换
cat data.json | jq 'map(.value * 2)'
5.3 数据统计
cat sales.json | jq '[.transactions[].amount] | add'
5.4 复杂结构处理
jq '. as $root | .items[] | select(.type=="book") | {title, author: $root.authors[.authorId]}' library.json
六、注意事项与常见问题
- Shell引用问题:在Unix shell中始终用单引号包裹jq程序
- 精度问题:大数字可能被转换为IEEE754双精度浮点数
- 性能考量:对于GB级JSON考虑使用
--stream选项 - 错误处理:使用
-e选项根据输出结果设置退出状态码
通过掌握这些核心概念和技巧,您可以充分利用jq的强大功能来处理各种JSON数据转换任务。jq的过滤器组合方式提供了极大的灵活性,能够满足从简单数据提取到复杂转换的各种需求。
【免费下载链接】jq Command-line JSON processor 项目地址: https://gitcode.com/gh_mirrors/jq/jq
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



