Linux json解析工具

jq是一个很好用的命令行处理json的工具,可以使用它直接在命令行下对JSON进行操作,分片、过滤、映射和转换。

安装

1
2
3
4
5
6
7
8
9
10
11
#ubuntu安装
apt-get update
apt-get install jq
#编译安装
git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure --disable-maintainer-mode
make
sudo make install

简单使用

格式化输出

test.json

1
[{"name":"xiaoming","age":"18","address":{"city":"上海","country":"中国"},"contacts":[{"phone":"132156465"}]}]

1
2
3
cat test.json | jq '.'
#或者
jq '.' test.json

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[
{
"name":"xiaoming",
"age":"18",
"address":{
"city":"上海",
"country":"中国"
},
"contacts": [
{
"phone":"132156465"
}
]
}
]

访问 JSON 对象的属性

访问元素的操作:.<attributename>.[index]
jq支持管道|,它如同linux命令中的管道线——把前面命令的输出当作是后面命令的输入。
如下命令把.[0]作为{...}的输入,进而访问嵌套的属性,如.name.address.city

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat test.json | jq '.[0] | {name:.name,city:.address.city}'
#输出:
{
"name": "xiaoming",
"city": "上海"
}
cat test.json | jq '.[0] | {phone:.contacts[0].phone,city:.address.city}'
#输出:
{
"phone": "132156465",
"city": "上海"
}

修改json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#修改属性的值,重定向到新的文件
MM_FILE=info.json
MM_AGE=18
get_name() {
return 'xiaoming'
}
jq '.people.address = "shanghai"' $MM_FILE > $MM_FILE.tmp
jq '.people.name = "'$(get_name)'"' $MM_FILE > $MM_FILE.tmp
jq '.people.age = "'${MM_AGE}'"' $MM_FILE > $MM_FILE.tmp
#输出数组,输出加上`[]`
cat test.json | jq '[.[0] | {name:.name,city:.address.city}]'
#输出:
[
{
"name": "xiaoming",
"city": "上海"
}
]
#添加属性
cat test.json | jq '[.[0] | {name_cp:.name,city_cp:.address.city}]'
#输出:
[
{
"name_cp": "xiaoming",
"city_cp": "上海"
}
]

参考资料