JSON 是前端编程经常用到的格式,对于 PHP 或者 Python,解析 JSON 都不是什么大事,尤其是 PHP 的 json_encode 和 json_decode 非常好用。而 Linux 下也有这样的神器,就是 jq 命令,对于运维平常处理 JSON 格式的文件有很大帮助!对于 JSON 格式而言,jq 就像 sed/awk/grep 这些神器一样的方便,而且 jq 没有乱七八糟的依赖,只需要一个 binary 文件 jq 就足矣。
一、安装
apt-get -y install jq
二、使用
1. 格式化 JSON
先准备一个测试文件 json_test.txt:
# cat json_test.txt
{"name":"WuDi",
"location":
{"street":"ZhongShanLu","city":"BeiJing","age":"26","country":"CN"},
"employees":[{"name":"Mark","division":"DevOps"},
{"name":"Lucy","division":"HR"},
{"name":"Elise","division":"Marketing"}
]}
上面的 JSON 是 PHP json_encode 之后 echo 出来的字符串,很明显,可读性太差。前一阵子写文档,需要将前后端的 JSON 写入文档,我当时用的是网上的 JSON 格式化工具。事实上,jq 就可以检查 JSON 的合法性,并把 JSON 格式化成更友好更可读的格式:
# cat json_test.txt | jq '.'
{
"name": "WuDi",
"location": {
"street": "ZhongShanLu",
"city": "BeiJing",
"age": "26",
"country": "CN"
},
"employees": [
{
"name": "Mark",
"division": "DevOps"
},
{
"name": "Lucy",
"division": "HR"
},
{
"name": "Elise",
"division": "Marketing"
}
]
}
如上所示,jq 将一团乱麻的 JSON 格式化成了更可读的形式,背后其实还检查了 JSON 的合法性:如果 JSON 不合法,jq . 会报错。
2. JSON 解析
对于如下形式的 JSON:
{
"key_1": "value_1",
"key_2": "value_2"
}
如何根据 key 获取 value?
jq '.key'
解析不存在的元素,会返回 null。
3. JSON 嵌套解析
[root@workingh ~]# cat json_test.txt | jq '.location.city'
"BeiJing"
4. JSON 数组解析
[root@workingh ~]# cat json_test.txt | jq '.employees[1].name'
"Lucy"
5. 内建函数
jq 还有一些内建函数,如 keys 和 has。
keys 是用来获取 JSON 中的 key 元素的:
[root@workingh ~]# cat json_test.txt | jq 'keys'
[
"employees",
"location",
"name"
]
has 是用来判断是否存在某个 key 的:
[root@workingh ~]# cat json_test.txt | jq 'has("location")'
true
[root@workingh ~]# cat json_test.txt | jq 'has("xxoo")'
false
三、小结
与 JSON 相关的内容就暂时介绍到这里。希望进一步了解 jq 并使用的,可以去 http://stedolan.github.io/jq/manual/ ;希望了解源码实现的,可以去 https://github.com/stedolan/jq ——意料之中的事情是,作者用了 flex 和 bison 来 parse JSON。另外用 Google 搜索时,kernalpanic 中有一篇文章介绍了 jshon 和 json.sh,提供了另外的思路。
参考资料: