VueMastery

来源
步骤
由于我是win11
系统的,接下来我以win11
的安装配置为例,介绍jq
的配置与使用。
jq
官网下载对应的.exe
的可执行程序。cmd
使用的话,将jq.exe
文件所在目录添加到系统环境变量;git bash
使用的话,为jq.exe
添加软链接符号到/bin
环境中。$ ln -s -f e:/cli/jq.exe /bin
$ ls /bin | grep jq
[
{
"name": "张三",
"age": 20,
"address": {
"privence": "广东省",
"city": "广州市"
},
"hobby": ["读书", "听音乐"]
},
{
"name": "李四",
"age": 25,
"address": {
"privence": "浙江省",
"city": "杭州市"
},
"hobby": ["唱跳rap", "游泳"]
},
{
"name": "小青",
"age": 18,
"address": {
"privence": "河南省",
"city": "开封市"
},
"hobby": ["旅游", "爬山"]
}
]
$ cat data.json | jq .
$ cat data.json | jq '.[0]'
{
"name": "张三",
"age": 20,
"address": {
"privence": "广东省",
"city": "广州市"
},
"hobby": [
"读书",
"听音乐"
]
}
注意
接下来的命令中,我们将省去展示数据输入的前缀命令cat data.json |
或者远程方式请求的数据输入例如curl'https://api.github.com/repos/jqlang/jq/commits?per_page=5' |
,因为它是不变的,这样避免命令过长。
jq '.'
和jq '.[]'
的输出结果不一样,前者输出是所有对象的数组,后者输出数组中的每个对象。
$ jq '.[]'
{
"name": "张三",
"age": 20,
"address": {
"privence": "广东省",
"city": "广州市"
},
"hobby": [
"读书",
"听音乐"
]
}
{
"name": "李四",
"age": 25,
"address": {
"privence": "浙江省",
"city": "杭州市"
},
"hobby": [
"唱跳rap",
"游泳"
]
}
{
"name": "小青",
"age": 18,
"address": {
"privence": "河南省",
"city": "开封市"
},
"hobby": [
"旅游",
"爬山"
]
}
$ jq '.[] | { name: .name , age: .age }'
{
"name": "张三",
"age": 20
}
{
"name": "李四",
"age": 25
}
{
"name": "小青",
"age": 18
}
.[]
返回的数组的每个元素,每次一个,这些元素都被输入到后面的过滤器安装{ name: .name, age: .age}
进行格式化处理。
将过滤器括在方括号
[]
中来告诉jq
收集所有结果。
$ jq '[.[] | { name: .name , age: .age }]'
[
{
"name": "张三",
"age": 20
},
{
"name": "李四",
"age": 25
},
{
"name": "小青",
"age": 18
}
]
$ jq '[.[] | { name: .name, addresses: [.address.privence]}]'
$ jq '[.[] | { name: .name, addresses: [.address | .privence], hobby: .hobby[0]}]'
[
{
"name": "张三",
"addresses": [
"广东省"
]
},
{
"name": "李四",
"addresses": [
"浙江省"
]
},
{
"name": "小青",
"addresses": [
"河南省"
]
}
]
# 起始索引是0可以省略, 两者等价
$ jq '[.[] | { name: .name, addresses: [.address | .privence], hobby: .hobby[0:2]}]'
$ jq '[.[] | { name: .name, addresses: [.address | .privence], hobby: .hobby[:2]}]'
$ jq '.[] | .name, .age'
"张三"
20
"李四"
25
"小青"
18
归纳
.[]
(当前值本身就是数组)表示遍历数组,如果.fieldname[]
表示将对象中某个字段的数组进行遍历。[]
表示收集元素放到一个列表里。.[index]
获取数组中具体索引的元素,索引从0
开始。.[]
表示返回数组中的所有元素。|
表示将上一个值传递给后面的过滤器。.foo?
表示获取对象中foo
字段的值,如果对象中不存在foo
字段,则返回null
,不会引起报错。.[]?
表示尝试遍历数组,但如果 不是数组或对象,则不会输出任何错误。