JSON 是一种轻量级的,不受语言束缚的数据存储格局,大部分编程语言都能够解析它,并且对编程人员也非常敌对。咱们在进行通信 / 数据交互时,十分常常用到 JSON 格局。
然而,咱们在进行数据存储的时候,JSON 格局是以一行的数据进行存储,浏览起来的话也会有些艰难。所以,为了更加便于浏览,咱们能够采纳一些办法对 JSON 数据进行格式化。
在各种编程语言里,都会有一些相应的库为咱们解析 JSON 数据,比方 C 语言里有 cjson,Python 里有 json.tool,等等。
那在 Linux 平台下,有没有一些工具能够不必编程,间接来格式化 / 解析 JSON 数据呢?
答案当然是必定的,这个工具就是 jq
。
jq 是一款命令行下解决 JSON 数据的工具。其能够承受规范输出,命令管道或者文件中的 JSON 数据,通过一系列的过滤器(filters)和表达式的转化后造成咱们须要的数据结构并将后果输入到规范输入中。jq 的这种个性使咱们能够很容易地在 Shell 脚本中调用它。
jq 工具的装置
有些发行版曾经内置了 jq 这个工具,但有些还没有。如果没有内置这个工具的话,就须要咱们手动装置了。
各平台的装置办法如下:
- Arch Linux 平台:
sudo pacman -S jq
- Debian, Ubuntu, Linux Mint 平台:
sudo apt-get install jq
- Fedora:
sudo dnf install jq
- OpenSUSE:
sudo zypper install jq
对于其它平台的装置,须要查问一下他们的官网装置领导手册。
应用 jq 工具格式化 JSON 数据
比方咱们当初有以下 JSON 数据:
{"firstName":"Liangxu","lastName":"Yan","age":18,"address":{"streetAddress":"21 2nd Street","city":"Guangzhou","province":"Guangdong","postalCode":"510655"},"phoneNumber":[{"type":"home","number":"020 555-1234"},{"type":"company","number":"020 555-4567"}],"gender":{"type":"male"}}
看起来很晕是吧?也不不便浏览是吧?
咱们先将这个文件保留为 liangxu.json 文件,而后再用 jq 工具格式化一下,使它更便于咱们浏览:
cat liangxu.json | jq '.'
输入后果:
{
"firstName": "Liangxu",
"lastName": "Yan",
"age": 18,
"address": {
"streetAddress": "21 2nd Street",
"city": "Guangzhou",
"province": "Guangdong",
"postalCode": "510655"
},
"phoneNumber": [
{
"type": "home",
"number": "020 555-1234"
},
{
"type": "company",
"number": "020 555-4567"
}
],
"gender": {"type": "male"}
}
‘.’ 是 jq 工具的最简略表达式,它不扭转输出,但能够将其柔美地输入,便于浏览和了解。
在以下的案例中,咱们均以此数据作为解析对象。
应用 jq 工具解析特定字段
在以上那个示例 JSON 数据中,如果咱们想要解析出 address 这个字段,咱们能够这样应用 jq 工具:
jq .address liangxu.json
输入后果:
{
"streetAddress": "21 2nd Street",
"city": "Guangzhou",
"province": "Guangdong",
"postalCode": "510655"
}
接下来,咱们来进一步解析地址中的邮编,咱们配合管道来进行。
cat liangxu.json | jq .address.postalCode
输入后果:
"510655"
请留神,应用 jq 命令时,过滤器是大小写敏感的,所以你在解析字段时,必须严格跟原字段一样,否则就无奈进行解析。
应用 jq 工具解析中数组中的元素
在 JSON 数据中,数组是以方括号括起来的一组元素。如果要解析数组中的元素,咱们就须要用到数组里的下标。
在示例 JSON 数据中,phonenumber 这个字段所存储的内容是一个数组,如果咱们要取得这个数组里的所有元素,咱们只需加上一对方括号即可,如下命令:
jq .phoneNumber[] liangxu.json
输入后果:
{
"type": "home",
"number": "020 555-1234"
}
{
"type": "company",
"number": "020 555-4567"
}
如果咱们要过滤出数组里的第一个元素,咱们能够加上下标 [0]:
jq .phoneNumber[0] liangxu.json
输入后果:
{
"type": "home",
"number": "020 555-1234"
}
jq 工具的内建函数
jq 工具为咱们提供了很多内建函数,这里介绍其中的两个:keys 和 has。
- keys
keys 是用来获取 JSON 中的 key 元素的,查找 JSON 数据中所有的键。
cat liangxu.json | jq 'keys'
输入后果:
[
"address",
"age",
"firstName",
"gender",
"lastName",
"phoneNumber"
]
- has
has 是用来是 JSON 数据中判断是否存在某个 key,它的输入后果是 true 或 false。
cat liangxu.json | jq 'has("alvin")'
输入后果:
false
小结
以上所介绍的是 jq 工具很根本的用法,jq 不仅可能满足一般性的常见需要,更蕴含运算、内置函数、条件比拟、变量申明、自定函数等弱小性能。对此感兴趣的敌人,无妨通过 jq 的官网手册 进行学习。
最初,最近很多小伙伴找我要 Linux 学习路线图 ,于是我依据本人的教训,利用业余时间熬夜肝了一个月,整顿了一份电子书。无论你是面试还是自我晋升,置信都会对你有帮忙!
收费送给大家,只求大家金指给我点个赞!
电子书 | Linux 开发学习路线图
也心愿有小伙伴能退出我,把这份电子书做得更完满!
有播种?心愿老铁们来个三连击,给更多的人看到这篇文章
举荐浏览:
- 干货 | 程序员进阶架构师必备资源免费送
- 神器 | 反对搜寻的资源网站