jq

命令行 JSON 处理器 - 在脚本和管道中解析、过滤、转换 JSON 数据

TL;DR

是什么:轻量级命令行 JSON 处理器。

为什么用:解析、过滤、转换 JSON,可脚本化,管道友好。

Quick Start

安装

# macOS
brew install jq

# Ubuntu/Debian
sudo apt install jq

# 检查版本
jq --version

基本用法

# 美化打印
echo '{"name":"John"}' | jq '.'

# 获取字段
echo '{"name":"John"}' | jq '.name'

# 从文件
jq '.' data.json

Cheatsheet

过滤器描述
.身份(整个输入)
.field获取字段
.[]遍历数组
.[0]数组索引
|管道过滤器
select()过滤项
map()转换项

Gotchas

基本选择

# 示例 JSON
echo '{"user":{"name":"John","age":30}}' | jq '.'

# 获取嵌套字段
echo '{"user":{"name":"John"}}' | jq '.user.name'
# 输出: "John"

# 获取原始字符串(无引号)
echo '{"name":"John"}' | jq -r '.name'
# 输出: John

# 多个字段
echo '{"name":"John","age":30}' | jq '.name, .age'

数组

# 示例数组
echo '[1,2,3,4,5]' | jq '.'

# 获取所有元素
echo '[1,2,3]' | jq '.[]'

# 按索引获取
echo '["a","b","c"]' | jq '.[1]'
# 输出: "b"

# 切片
echo '[1,2,3,4,5]' | jq '.[2:4]'
# 输出: [3,4]

# 数组长度
echo '[1,2,3]' | jq 'length'

数组中的对象

# 示例数据
DATA='[{"name":"John","age":30},{"name":"Jane","age":25}]'

# 获取所有名字
echo $DATA | jq '.[].name'

# 获取第一项
echo $DATA | jq '.[0]'

# 映射到新结构
echo $DATA | jq 'map({n: .name, a: .age})'

过滤

# 选择项
echo '[1,2,3,4,5]' | jq 'map(select(. > 2))'
# 输出: [3,4,5]

# 过滤对象
DATA='[{"name":"John","age":30},{"name":"Jane","age":25}]'
echo $DATA | jq '.[] | select(.age > 26)'

# 多条件
echo $DATA | jq '.[] | select(.age > 20 and .name == "John")'

转换

# 映射值
echo '[1,2,3]' | jq 'map(. * 2)'
# 输出: [2,4,6]

# 添加字段
echo '{"name":"John"}' | jq '. + {age: 30}'

# 更新字段
echo '{"count":1}' | jq '.count += 1'

# 删除字段
echo '{"name":"John","age":30}' | jq 'del(.age)'

# 构建新对象
echo '{"first":"John","last":"Doe"}' | jq '{fullName: "\(.first) \(.last)"}'

实用示例

# 解析 API 响应
curl -s https://api.github.com/users/octocat | jq '{name, company, location}'

# 统计项数
cat data.json | jq 'length'

# 求和
echo '[{"price":10},{"price":20}]' | jq '[.[].price] | add'

# 按字段分组
echo '[{"type":"a"},{"type":"b"},{"type":"a"}]' | jq 'group_by(.type)'

# 排序
echo '[3,1,2]' | jq 'sort'
echo '[{"name":"B"},{"name":"A"}]' | jq 'sort_by(.name)'

Next Steps