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 的官方手册 进行学习。


公众号:良许Linux

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

教你不编程快速解析 JSON 数据的更多相关文章

  1. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

  2. C#如何解析JSON数据(反序列化对象)

    第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化对象) 第四章:C#如何生成JSON字符串提交给接口 ...

  3. 自动化测试 如何快速提取Json数据

    Json作为一种轻量级的交换数据形式,由于其自身的一些优良特性比如包含有效信息多,易于阅读和解析. 使用Json的场景也很多,比如读取解析系列化的Json格式的数据,我们需要将一个Json的字符串解析 ...

  4. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  5. 使用jQuery解析JSON数据

    我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...

  6. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  7. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

  8. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  9. fastjson生成和解析json数据,序列化和反序列化数据

    本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...

随机推荐

  1. rsync+inotify 备份

    一,服务端安装(备份服务器): #安装rsync cd /usr/local/src/ wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.ta ...

  2. request.headers.get头部获取内容的缺失

    1.说明 今天遇到了一个小坑,在做权限控制的时候,用头部传递了参数取名为table_privilege_id, 在本地测试的时候是可以接到这个参数的,但是通过ngxin转发之后,奇怪了,怎么也拿不到这 ...

  3. postman 进阶技巧

    cookie 清除缓存 code 生成接口自动化测试脚本 响应部分 pretty 响应以json或xml显示 raw 响应以文本显示 preview 以HTML网页行驶显示 断言 断言:用于判断接口请 ...

  4. include文件包含漏洞

    发现allow_url_include 是on状态 既然已经直接包含了phpinfo()是文件,首先搜索了一下allow_url_include,发现是处于打开的状态. 既然 allow_url_in ...

  5. Spring升级案例之IOC介绍和依赖注入

    Spring升级案例之IOC介绍和依赖注入 一.IOC的概念和作用 1.什么是IOC 控制反转(Inversion of Control, IoC)是一种设计思想,在Java中就是将设计好的对象交给容 ...

  6. oracle数据库查询分组之外的数据方法

    select * from (select t.*,row_number() over(partition by 分组字段 order by rownum) rn from 表名 t where 条件 ...

  7. 题解 CF1354D 【Multiset】

    考试拿到题,一看,这不是权值线段树吗? 思路 使用线段树每个节点维护该区间内元素出现次数. 根据题目,对于加入.删除元素,我们可以单点修改(\(+1\).\(-1\)),对于输出,我们可 随便 遍历找 ...

  8. ES6标准中的import和export

    在ES6前, 前端使用RequireJS或者seaJS实现模块化, requireJS是基于AMD规范的模块化库,  而像seaJS是基于CMD规范的模块化库,  两者都是为了为了推广前端模块化的工具 ...

  9. [jvm] -- 垃圾收集器篇

    垃圾收集器 Serial 收集器 单线程收集器,不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The ...

  10. [jvm] -- 类文件结构篇

    类文件结构 结构图  魔数 头四个字节,作用是确定这个文件是否为一个能被虚拟机接收的 Class 文件. Class 文件版本 第五和第六是次版本号,第七和第八是主版本号. 高版本的 Java 虚拟机 ...