jqiyEnglish
JQ 在线工具

掌握 JQ:15 个实用例子

通过实用例子学习如何使用 jq 查询和转换 JSON 数据。从基本过滤到高级转换。

1. 美化输出 JSON

最简单的 jq 命令就是用 `.` 过滤器美化输出整个 JSON。

echo '{"name":"Alice","age":30}' | jq .

2. 提取特定字段

使用 `.field` 从 JSON 对象中提取单个字段。这是最常见的 jq 操作。

echo '{"name":"Alice","age":30}' | jq .name
# "Alice"

3. 访问嵌套字段

通过点号或管道链式访问嵌套属性:`.user.address.city`

echo '{"user":{"address":{"city":"北京"}}}' | jq .user.address.city
# "北京"

4. 遍历数组

使用 `.[]` 遍历数组元素。每个元素单独输出。

echo '[1,2,3]' | jq .[]
# 1
# 2
# 3

5. 按条件选择元素

使用 `select(.field > value)` 根据条件过滤数组元素。

echo '[{"name":"Alice","age":30},{"name":"Bob","age":25}]' | jq '.[] | select(.age > 25)'
# { "name": "Alice", "age": 30 }

6. 数组转对象

使用 `from_entries` 将键值对数组转换为对象。

echo '[{"key":"name","value":"Alice"},{"key":"age","value":30}]' | jq 'from_entries'
# { "name": "Alice", "age": 30 }

7. 对象转键值对数组

使用 `to_entries` 将对象转换为 `{key, value}` 对象数组。

echo '{"name":"Alice","age":30}' | jq 'to_entries'
# [{"key":"name","value":"Alice"},{"key":"age","value":30}]

8. 映射值

使用 `map(expression)` 转换数组中的每个元素。

echo '[1,2,3,4]' | jq 'map(. * 2)'
# [2, 4, 6, 8]

9. 添加/更新字段

使用 `+` 合并对象或向现有 JSON 添加新字段。

echo '{"name":"Alice"}' | jq '. + {age: 30, role: "admin"}'

10. 删除字段

使用 `del(.field)` 从对象中删除字段。

echo '{"name":"Alice","age":30,"temp":"remove"}' | jq 'del(.temp)'

11. 按字段分组

使用 `group_by(.field)` 按公共字段值对数组元素进行分组。

echo '[{"city":"BJ","name":"A"},{"city":"SH","name":"B"},{"city":"BJ","name":"C"}]' | jq 'group_by(.city)'

12. 唯一值

使用 `unique` 或 `unique_by(.field)` 从数组中移除重复项。

echo '[1,2,2,3,3,3]' | jq 'unique'
# [1, 2, 3]

13. 字符串插值

在双引号字符串中使用 `\\(expression)` 进行字符串插值。

echo '{"name":"Alice","score":95}' | jq '"Hello, \(.name)! Your score is \(.score)."'

14. 原始输出 (-r)

使用 -r 标志(或在 playground 中勾选原始输出)以不带 JSON 引号的方式输出字符串。

echo '{"name":"Alice"}' | jq -r '.name'
# Alice (无引号)

15. 复杂管道

在单个管道中组合多个 jq 功能,实现强大的数据转换。

echo '{"users":[{"name":"Alice","age":30,"role":"admin"},{"name":"Bob","age":25,"role":"user"},{"name":"Charlie","age":35,"role":"admin"}]}' | jq '.users | map(select(.role == "admin")) | sort_by(.age) | .[] | {name, senior: (.age > 30)}'