绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
教你不编程快速解析 JSON 数据
2019-04-27 13:41:51

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 j

对于其它平台的安装,需要查询一下他们的官方安装指导手册。

使用 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 工具为我们提供了很多内建函数,这里介绍其中的两个:keyshas

  • 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】,后台回复关键字:

  1. 回复【1024】:免费获取不断更新的海量技术资源;
  2. 回复【CSDN】:免费进入CSDN资源下载群;
  3. 回复【进群】:免费进入高手如云技术交流群。

干货分享 · 资源共享 · 认知提高 · 英语学习

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Linux技术精选专区
创建时间:2020-07-08 10:30:23
Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • dapan
    专家
戳我,来吐槽~