如果 curl 是 HTTP 的手,那 jq 就是 JSON 的大脑。
JSON 已经成为现代系统的“公共语言”,但问题是:
而 jq 做的事情只有一件:
把 JSON 变成你真正需要的结构。
一、为什么 jq 值得认真学?
先讲现实。没有 jq 的世界
curl ... | grep | awk | sed
有 jq 的世界
curl ... | jq '.data.users[] | .id'
jq 不是文本处理工具,它是结构化数据处理工具。
二、jq 最小入门(5 分钟就会)1️⃣ 最基础用法:美化JSON
cat data.json | jq
curl -s api.example.com | jq
2️⃣ 字段访问(等价于SQL )
jq '.data'
jq '.data.user'
jq '.data.user.name'
规则:. 表示当前对象
3️⃣ 数组访问
jq '.users[0]'jq '.users[].id'
.:展开数组
4️⃣ 多字段投影(像 col1, col2)
jq '{id: .id, name: .name}'
三、把jq当SQL来理解
下面这张“对照表”,是理解 jq 的关键。
四、:字段选择与重构示例 JSON
{
"users": [
{
"id": 1,
"name": "Tom",
"age": 30,
"role": "admin"
},
{
"id": 2,
"name": "Bob",
"age": 25,
"role": "user"
}
]
}
1️⃣ *
jq '.users[]'
2️⃣ 指定字段
jq '.users[] | {id, name}'
3️⃣ 字段重命名(AS)
jq '.users[] | {user_id: .id, user_name: .name}'
五、WHERE:过滤条件()1️⃣ 简单条件
jq '.users[] | select(.age > 28)'
2️⃣ 多条件(AND / OR)
jq '.users[] | select(.age > 28 and .role == "admin")'
3️⃣ 字段存在判断
jq '.users[] | select(has("role"))'
六、ORDER BY / ️⃣ 排序
jq '.users | sort_by(.age)'
倒序:
jq '.users | sort_by(.age) | reverse'
2️⃣ LIMIT /
jq '.users[0:1]'
七、GROUP BY:最容易劝退,但最强1️⃣ 按字段分组
jq '.users | group_by(.role)'
️ group_by必须先排序
正确姿势:
jq '.users | sort_by(.role) | group_by(.role)'
2️⃣ 分组统计(COUNT)
jq '.users
| sort_by(.role)
| group_by(.role)
| map({role: .[0].role, count: length})'
八、聚合函数(像 SQL 的 SUM / AVG)COUNT
jq '.users | length'
SUM
jq '[.users[].age] | add'
AVG
jq '[.users[].age] | add / length'
九、JOIN 思维(jq 没有 JOIN,但能做)示例:用户 + 订单
{
"users": [
{"id": 1, "name": "Tom"},
{"id": 2, "name": "Bob"}
],
"orders": [
{"user_id": 1, "amount": 100},
{"user_id": 2, "amount": 50}
]
}
手动“JOIN”
jq '
.users[] as $u
| .orders[]
| select(.user_id == $u.id)
| {user: $u.name, amount}
'
#输出
{
"user": "Tom",
"amount": 100
}
{
"user": "Bob",
"amount": 50
}
工程中非常常见
十、map / :函数式利器map(批量变换)
jq '.users | map(.name)'
(高级统计)
jq 'reduce .users[].age as $a (0; . + $a)'
十一、字符串 / 时间 / 类型处理字符串拼接
jq '"Hello " + .name'
类型转换
jq '.id | tostring'
时间戳转换
jq '.ts | todate'
十二、错误处理与安全写法(工程必备)1️⃣ 字段不存在不报错
jq '.data?.user?.name'
2️⃣ 提供默认值
jq '.age // 0'
3️⃣ 严格模式(CI 用)
jq -e '.code == 0'
十三、jq + curl:真实工程套路登录 → 提 token
TOKEN=$(curl -s api/login | jq -r '.token')
校验接口返回
curl -s api/health | jq -e '.status == "ok"'
批量提取 ID
curl -s api/users | jq -r '.users[].id'
十四、jq 心法总结(非常重要) 把 jq 当 SQL 用 多用管道
| jq '... | ... | ...'
宁可写长,也别写怪
可维护性 > 炫技
结语:jq 是后端工程师的“第二查询语言”
你可能:
当你能像写 SQL 一样写 jq,JSON 就不再是负担,而是原材料。


发表回复