← 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)}'