教你不编程快速解析 JSON 数据
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

有收获?希望老铁们来个三连击,给更多的人看到这篇文章
教你不编程快速解析 JSON 数据的更多相关文章
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
- C#如何解析JSON数据(反序列化对象)
第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化对象) 第四章:C#如何生成JSON字符串提交给接口 ...
- 自动化测试 如何快速提取Json数据
Json作为一种轻量级的交换数据形式,由于其自身的一些优良特性比如包含有效信息多,易于阅读和解析. 使用Json的场景也很多,比如读取解析系列化的Json格式的数据,我们需要将一个Json的字符串解析 ...
- 使用Python解析JSON数据的基本方法
这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下: ----------------------------------- ...
- 使用jQuery解析JSON数据
我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- 用jquery解析JSON数据的方法以及字符串转换成json的3种方法
用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...
- Android中使用Gson解析JSON数据的两种方法
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...
- fastjson生成和解析json数据,序列化和反序列化数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
随机推荐
- 从0开始,手把手教你使用React开发答题App
项目演示地址 项目演示地址 项目源码 项目源码 其他版本教程 Vue版本 小程序版本 项目代码结构 前言 React 框架的优雅不言而喻,组件化的编程思想使得React框架开发的项目代码简洁,易懂,但 ...
- cmder安装(window下好用的终端)
cmder下载地址:cmder官网 安装步骤: 下载cmder(cmder官网)并解压缩 配置环境变量 先配置CMDER_HOME(cmder.exe所在目录) 配置path:%CMDER_HOME% ...
- Scala 基础(四):Scala变量 (一) 基础
1.概念 变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门 牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值). 2 变量使用的基本步骤 1) 声明/定义变量 ( ...
- JVM 专题十:运行时数据区(五)堆
1. 核心概述 1.1 堆概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈. 一个jvm实例只存在一个堆内存 ...
- bzoj2134单选错位
bzoj2134单选错位 题意: 试卷上n道选择题,每道分别有ai个选项.某人全做对了,但第i道题的答案写在了第i+1道题的位置,第n道题答案写在第1题的位置.求期望能对几道.n≤10000000 题 ...
- Java 分布式任务调度平台:PowerJob 快速开始+配置详解
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 引言 HelloGitHub 推出的<讲解开源项目>系列. 项目地址: https://github.c ...
- Windows 磁盘分区后如何再合并&如何用Windows自带工具扩大某个分区
Windows 磁盘分区后如何再合并&用Windows自带工具扩大某个分区 注:此方法有一定的成功率,更加完善可行的方法请看http://www.diskgenius.cn/help/part ...
- Python Ethical Hacking - Malware Analysis(2)
Filtering Command Output using Regex #!/usr/bin/env python import smtplib import subprocess import r ...
- 手把手撸套框架-ORM框架的选择
目录 一,为什么选择SqlSugar? 在.net core ORM框架中,能选择的方案其实有很多,包括以下方案: 1,EF-Core 2,Dapper 3,FreeSql 4,SqlSugar 为什 ...
- ant design pro : 依赖项 webpack-theme-color-replacer 最新版导致项目无法启动?
重新装了一个项目的依赖,结果发现打不开了? 报错如下: This dependency was not found: * webpack-theme-color-replacer/client in ...