深入了解jq:JSON结构化数据处理工具的使用方法

如果 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 就不再是负担,而是原材料。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注