深入理解 stedolan/jq:JSON 处理工具的核心概念与基础用法
jq 项目地址: https://gitcode.com/gh_mirrors/jq1/jq
什么是 jq?
jq 是一个轻量级且功能强大的命令行 JSON 处理器。它允许你以高效的方式提取、转换和处理 JSON 数据。与传统的编程语言不同,jq 采用基于过滤器的数据处理模型,通过组合简单的操作来构建复杂的数据转换流程。
jq 的核心概念:过滤器模型
jq 的核心思想是过滤器(filter)模型。每个 jq 程序本质上都是一个过滤器,它接收输入并产生输出。这种设计使得 jq 特别适合处理数据流,你可以将多个过滤器通过管道连接起来,构建复杂的数据处理流程。
过滤器特性
-
每个过滤器都有输入和输出:即使是简单的字面量如
"hello"
或42
也是过滤器,它们忽略输入并始终产生相同的输出。 -
过滤器可以组合:通过管道符号
|
可以将一个过滤器的输出传递给另一个过滤器。 -
自动迭代:某些过滤器会产生多个结果(如数组展开),后续过滤器会自动为每个结果执行。
基础过滤器详解
1. 恒等过滤器 .
最简单的过滤器是点号 .
,它接收输入并原样输出。这在格式化 JSON 数据时特别有用。
echo '{"name":"John","age":30}' | jq '.'
2. 对象属性访问 .foo
和 .["foo"]
.foo
:获取对象的属性值.["foo"]
:功能相同,但可以处理包含特殊字符的属性名
echo '{"name":"John","age":30}' | jq '.name'
# 输出:"John"
3. 安全属性访问 .foo?
与 .foo
类似,但当输入不是对象时不会报错,而是返回空。
4. 数组索引和切片
.[0]
:获取数组第一个元素.[1:3]
:获取索引1到3(不包括3)的子数组.[-1]
:获取最后一个元素
echo '[10,20,30,40,50]' | jq '.[1:3]'
# 输出:[20,30]
5. 展开操作 .[]
将数组或对象的值展开为多个输出:
echo '[1,2,3]' | jq '.[]'
# 输出:
# 1
# 2
# 3
6. 逗号操作符 ,
允许并行执行多个过滤器,按顺序产生所有结果:
echo '{"a":1,"b":2}' | jq '.a, .b'
# 输出:
# 1
# 2
7. 管道操作符 |
将左侧过滤器的输出作为右侧过滤器的输入:
echo '[{"name":"John"},{"name":"Jane"}]' | jq '.[] | .name'
# 输出:
# "John"
# "Jane"
常用命令行选项
jq 提供了丰富的命令行选项来控制输入输出行为:
-r
/--raw-output
:直接输出原始字符串(去掉JSON引号)-c
/--compact-output
:紧凑输出(不美化)-s
/--slurp
:将整个输入作为单个数组处理-n
/--null-input
:不使用输入,从null开始处理--arg
:传递参数给jq程序
echo '1 2 3' | jq -s 'add'
# 输出:[1,2,3]的和6
实际应用示例
1. 提取和格式化数据
curl -s https://api.example.com/users | jq '.[] | {name: .username, email: .contact.email}'
2. 数据统计
echo '[{"price":10},{"price":20},{"price":30}]' | jq 'map(.price) | add'
# 输出所有价格的和60
3. 复杂数据转换
echo '{"items":[{"id":1,"qty":2},{"id":2,"qty":3}]}' | jq '{total: (.items | map(.qty) | add), count: (.items | length)}'
# 输出:{"total":5,"count":2}
总结
jq 的强大之处在于其简洁而富有表现力的过滤器语法。通过组合基本过滤器,你可以构建出复杂的数据处理流程,而无需编写冗长的代码。掌握这些基础概念后,你将能够高效地处理各种JSON数据操作任务。
记住,jq 的学习曲线可能一开始看起来有些陡峭,但一旦理解了过滤器模型和管道操作的概念,你会发现它比传统的编程语言处理JSON数据要高效得多。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考