有时需要在linux 的命令行下,需要查看json的内容或针对json进行各种操作,本文针对此进行梳理、总结。
在Linux系统下基于python json.tool可以格式化json,使用jq工具可以非常方便的处理json,可以创建生成json、编辑json、进行各种查询操作及类型转换
1. 基于python json.tool格式化json
1.1.直接格式化json字符串或文件
echo '{"status":"200","data":[{"id":123,"addr":"广州天河"}],"time":1595921796,"info":"测试测试"}' | python -m json.tool
#文件较长的情况, 导出文件用vim查看
cat json.txt | python -m json.tool
#文件较长的情况, 导出文件用vi查看
cat json.txt | python -m json.tool > json.json
vi json.json
1.2.格式化http返回的结果
curl -X POST 'http://ip.taobao.com/outGetIpInfo?ip=114.114.114.114&accessKey=alibaba-inc' | python -m json.tool
1.3.疑难解决:格式化后中文乱码
见1.2.格式化后的结果,针对中文,转化为ASCII编码进行了展示,需要进行源码修改,才能解决此问题
- 在当前用户目录下 或 根目录下查询tool.py文件
- 修改tool.py文件,在json.dump方法中增加
ensure_ascii=False
参数,即让json.tool模块不强行保证json的内容都转为ASCII编码 - 修改后再执行命令
curl -X POST 'http://ip.taobao.com/outGetIpInfo?ip=223.5.5.5&accessKey=alibaba-inc' | python -m json.tool
,则能正确的输出中文字符串
注意:
- json/tool.py 对应 -m json.tool
- json5/tool.py 对应 -m json5.tool
- simplejson/tool.py 对应 -m simplejson.tool
find ~ -name tool.py
find / -name tool.py
2. jq
2.1. jq介绍
jq是一个轻量级且灵活的命令行JSON处理器。
在Linux系统下使用jq工具可以非常方便的处理json,可以创建生成json、编辑json、进行各种查询操作及类型转换
- jq类似于JSON数据的sed——您可以使用它来切片、过滤、映射和转换结构化数据,就像sed、awk、grep和其他命令让您轻松处理文本一样。
- jq是用可移植的C编写的,它没有运行时依赖项。您可以下载一个二进制文件,将其scp到很远的相同类型的机器上,并期待它能够工作。
- jq可以轻松地将您拥有的数据格式转换为您想要的格式,而实现此目的的程序通常比您预期的更短、更简单。
- 源码地址
- 使用文档
2.2.安装jq
在centos 7.x上安装jq
yum install epel-release
yum install jq
jq --version
显示:jq-1.6
2.3. 使用示例
2.3.1. 创建
[root@node22 ~]# jq -n {a:1}
{
"a": 1
}
2.3.2. 合并
[root@node22 ~]# jq -n '{a:"test"} + {b:2}'
{
"a": "test",
"b": 2
}
[root@node22 ~]# jq -n '{a:"test"} + {b:2} + {c:"testc"}'
{
"a": "test",
"b": 2,
"c": "testc"
}
2.3.3. 删除
[root@node22 ~]# cat test.json
{"a": "test","b": 2, "c": "testc"}
[root@node22 ~]# cat test.json |jq .
{
"a": "test",
"b": 2,
"c": "testc"
}
[root@node22 ~]# cat test.json |jq 'del(.b)'
{
"a": "test",
"c": "testc"
}
2.3.4. 更新
[root@node22 ~]# cat test.json |jq '.b="testb"'
{
"a": "test",
"b": "testb",
"c": "testc"
}
[root@node22 ~]# cat test.json |jq '. + {d:4}'
{
"a": "test",
"b": 2,
"c": "testc",
"d": 4
}
[root@node22 ~]# cat test.json |jq '. + {d:4}' |jq '.d={dd:5}'
{
"a": "test",
"b": 2,
"c": "testc",
"d": {
"dd": 5
}
}
2.3.5. 查询
[root@node22 ~]# cat test.json |jq .
{
"a": "test",
"b": 2,
"c": "testc",
"d": {
"dd": 5
}
}
[root@node22 ~]# cat test.json |jq '. + {d:4}' |jq '.d={dd:5}' |jq .d.dd
5
[root@node22 ~]# echo '{"a":1,"b":2}' |jq '[.a,.b]'
[
1,
2
]
2.3.6. 查看数据类型
[root@node22 ~]# echo "{}" |jq -r type
object
[root@node22 ~]# echo '[0, false, [], {}, null, "hello"]' |jq 'map(type)'
[
"number",
"boolean",
"array",
"object",
"null",
"string"
]
2.3.7. 数组操作
#查询数组的长度
[root@node22 ~]# echo [1,2,3] |jq .[1]
2
[root@test-dhcp ~]# echo [1,2,3] |jq .[0,2]
1,3
#查询数组长度
[root@node22 ~]# echo [1,2,3,9] |jq '.|length'
4
#数组相加
[root@node22 ~]# echo [1,2,3] |jq '. + [4,5,6]'
[
1,
2,
3,
4,
5,
6
]
2.3.8. 高级查询
[root@node22 ~]# echo [1,2,3] | jq 'map(select(. >= 2))'
[
2,
3
]
[root@node22 ~]# echo [1,2,3] | jq 'map(select(. == 2))'
[
2
]
[root@node22 ~]# echo [1,2,3] | jq 'map(select(. != 2))'
[
1,
3
]
[root@node22 ~]# cat test.json
[
{
"id": "0",
"model": "Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz"
},
{
"id": "1",
"model": "Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz"
}
]
[root@node22 ~]# cat test.json |jq .[].model
"Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz"
"Intel(R)Xeon(R)CPUE5-2620v4@2.10GHz"
2.3.9. 类型转换
[root@node22 ~]# echo '["a","b,c,d","e"]' |jq 'join(",")'
"a,b,c,d,e"
[root@node22 ~]# cat test.json
liuxin,30,male
jiaweiqiang,29,femal
[root@node22 ~]# jq -R 'split(",")|{"name":.[0],"age":.[1],"sex":.[2]}' ./test.json
{
"name": "liuxin",
"age": "30",
"sex": "male"
}
{
"name": "jiaweiqiang",
"age": "29",
"sex": "femal"
}
[root@node22 ~]# cat test.json
{
"name": "liuxin",
"age": "30",
"sex": "male"
}
{
"name": "jiaweiqiang",
"age": "29",
"sex": "femal"
}
[root@node22 ~]# cat test.json |jq . -c
{"name":"liuxin","age":"30","sex":"male"}
{"name":"jiaweiqiang","age":"29","sex":"femal"}