教你不编程快速解析 JSON 数据

栏目: 后端 · 前端 · 发布时间: 5年前

内容简介:JSON 是一种轻量级的,不受语言约束的数据存储格式,大部分编程语言都可以解析它,并且对编程人员也十分友好。我们在进行通讯/数据交互时,非常经常用到 JSON 格式。但是,我们在进行数据存储的时候,JSON 格式是以一行的数据进行存储,阅读起来的话也会有些困难。所以,为了更加便于阅读,我们可以采用一些方法对 JSON 数据进行格式化。在各种编程语言里,都会有一些相应的库为我们解析 JSON 数据,比如 C 语言里有 cjson ,Python 里有 json.tool ,等等。

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 工具为我们提供了很多内建函数,这里介绍其中的两个: 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 的官方手册 进行学习。

-----------------

我是良许, 世界500强 外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注我的公众号「 良许Linux 」,回复「 1024 」获取最新最全的技术资料,回复「 入群 」进入高手如云技术交流群。

教你不编程快速解析 JSON 数据


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java Servlet & JSP Cookbook

Java Servlet & JSP Cookbook

Bruce W. Perry / O'Reilly Media / 2003-12-1 / USD 49.99

With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will ......一起来看看 《Java Servlet & JSP Cookbook》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具