如何使用强大的命令行json解析工具jq

一、json的基础知识

1.json是什么

定义:json是一种通用的数据交换格式,其本质是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,json被广泛应用于数据交换中。(如前后端数据交换)
形式:数组,对象
通过这两种结构可以表示各种复杂的结构

1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种

2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 [“java”,“javascript”,“vb”,“c++”…],取值方式和所有语言中一样,使用索引获取(从0开始),字段值的类型可以是数字、字符串、数组、对象几种。

例如:我们往一个url发送GET请求,返回多个json对象,这些json对象组合成一个json对象数组。
json对象(格式化形式)

{"id":1,"name":"zhangsan","age":24,"desc":"无名侠客","company":["baidu","google","alibaba"]
}

json对象数组(格式化形式)

[{"id":1,"name":"zhangsan","age":24,"desc":"无名侠客","company":["baidu","google","alibaba"]},{"id":2,"name":"lisi","age":18,"desc":"勇往直前","company":["tencent","google","bytedance"]}
]

压缩的形式:(实际传输的时候是压缩形式)

{"id":1,"name":"zhangsan","age":24,"desc":"无名侠客","company":["baidu","google","alibaba"]}

总结:

json对象是以{}包括起来的无序的键值对集合,数组是有序的值集合。(这里的值可以是数字,字符串,json对象,数组)

2.json序列化和反序列化

序列化:字典 / 列表 / 数字 /对象 -经过序列化 —>字符串 (从面向对象的角度来说,序列化就是把对象转换成json格式的字符串

反序列化:字符串 —> 字典 / 列表 / 数字 /对象 (反序列化就是把json字符串变回对象) 为什么要序列化

  • 要把内容写入文件
  • 网络传输数据 序列化

参考文档:json语法

二、如何在命令行使用jq工具

背景:一般情况下我们可以有很多办法处理返回回来的json数据,使其以我们想要格式显示,在集成开发环境中可以用各种类库来实现,而在linux中可以通过awk语法对json数据进行处理,更为便捷的办法就是采用jq工具。

1.如何下载jq工具

ubuntu系统下:

apt install jq

linux系统下

yum install jq

下载失败的几种原因:

  • 没有在root用户权限下下载
  • 没有配置镜像源

2.jq表达式

①什么是jq表达式

  • jq表达式实际上就是过滤器,过滤出我们想要的数据格式。
  • jq 表达式支持串行化操作。一个复杂的表达式可以有多个简单的,以"|"符号分割的,串行化执行的表达式组成。每个表达式以其前边表达式的结果为输入。例如:有 JSON 数据{“name”:{“firstname”:“Tom”,“lastname”:“Clancy”}}。我们要查询 lastname 属性可以使用表达式’.name|.lastname’。

②基础表达式

基础表达式(Basic filters)是 jq 提供的基本过滤器,用来访问 JSON 对象中的属性。基础表达式也是实现更复杂查询功能的基础。基础表达式主要有以下几种:

  • ‘.’ 符号。整个JSON对象作为表达式输入
  • 数组操作,具体见后文
  • 表达式操作(‘,‘和 ‘|’)。表达式操作是用来关联多个基础表达式。其中逗号表示对同一个输入应用多个表达式。管道符表示将前一个表达式的输出用作后一个表达式的输入。当前一个表达式产生的结果是迭代器时,会将迭代器中的每一个值用作后一个表达式的输入从而形成新的表达式。例如’.[]|.+1’, 在这个表达式中, 第一个子表达式'.[]'在输入数组上构建迭代器,第二个子表达式则在迭代器的每个元素上加 1。

3.使用jq工具

参考文档:jq Manual

①查看jq的帮助指令

在命令行输入jq --help

jq --help
jq - commandline JSON processor [version 1.6]Usage:  jq [options] <jq filter> [file...]jq [options] --args <jq filter> [strings...]jq [options] --jsonargs <jq filter> [JSON_TEXTS...]jq is a tool for processing JSON inputs, applying the given filter to
its JSON text inputs and producing the filter's results as JSON on
standard output.The simplest filter is ., which copies jq's input to its output
unmodified (except for formatting, but note that IEEE754 is used
for number representation internally, with all that that implies).For more advanced filters see the jq(1) manpage ("man jq")
and/or https://stedolan.github.io/jqExample:$ echo '{"foo": 0}' | jq .{"foo": 0}Some of the options include:-c               compact instead of pretty-printed output;-n               use `null` as the single input value;-e               set the exit status code based on the output;-s               read (slurp) all inputs into an array; apply filter to it;-r               output raw strings, not JSON texts;-R               read raw strings, not JSON texts;-C               colorize JSON;-M               monochrome (don't colorize JSON);-S               sort keys of objects on output;--tab            use tabs for indentation;--arg a v        set variable $a to value <v>;--argjson a v    set variable $a to JSON value <v>;--slurpfile a f  set variable $a to an array of JSON texts read from <f>;--rawfile a f    set variable $a to a string consisting of the contents of <f>;--args           remaining arguments are string arguments, not files;--jsonargs       remaining arguments are JSON arguments, not files;--               terminates argument processing;Named arguments are also available as $ARGS.named[], while
positional arguments are available as $ARGS.positional[].See the manpage for more options.

②常用参数说明

-s 表示将输入的多个json对象组合成一个json数组,也就可以通过索引来操作该JSON数组了。具体效果如下:

$ cat test.json 现在输出的是多个json对象
{"id":1,"name":"zhangsan","age":24,"desc":"无名侠客","company":["baidu","google","alibaba"]
}
{"id":2,"name":"lisi","age":18,"desc":"勇往直前","company":["tencent","google","bytedance"]
}
$ jq  '.[1]'<test.json  #无法直接用索引的方式获取对象
jq: error (at <stdin>:11): Cannot index object with number
jq: error (at <stdin>:22): Cannot index object with number$ jq -s '.[1]'<test.json  ##加了-s参数,转换成数组对象,就可以直接用索引的方式获取对象
{"id": 2,"name": "lisi","age": 18,"desc": "勇往直前","company": ["tencent","google","bytedance"]
}

-r直接输出原字符串,而不是JSON文本,也就是把引号去掉。具体如下:

➜ ~ jq '.[].name' <test.json
"zhangsan"
"lisi"
➜ ~ jq -r  '.[].name' <test.json
zhangsan
lisi

-S给JSON对象的内容按键排序

jq -S .<test.json
[{"age": 24,"company": ["baidu","google","alibaba"],"desc": "无名侠客","id": 1,"name": "zhangsan"},{"age": 18,"company": ["tencent","google","bytedance"],"desc": "勇往直前","id": 2,"name": "lisi"}
]

4.案例分析

①格式化显示json字符串

用单引号把json数据包括起来就是json字符串,如:'json数据'
说明:利用管道符的传递功能,用jq处理输出输入数据,使其按规定格式显示。

格式化显示全部字符串:
jq .

$ echo '{"id":1,"name":"zhangsan","age":24,"desc":"无名侠客","company":["baidu","google","alibaba"]}' | jq .
{"id": 1,"name": "zhangsan","age": 24,"desc": "无名侠客","company": ["baidu","google","alibaba"]
}

②如何调用jq工具

背景:test.json是我们存储json数据的文件。

$ jq . test.json   #等价于jq . <test.json
[{"id": 1,"name": "zhangsan","age": 24,"desc": "无名侠客","company": ["baidu","google","alibaba"]},{"id": 2,"name": "lisi","age": 18,"desc": "勇往直前","company": ["tencent","google","bytedance"]}
]

③数组操作。

jq 提供三种基础表达式来操作数组:

  • 迭代器操作(‘.[]’). 该表达式的输入可以是数组或者 JSON 对象。输出的是基于数组元素或者 JSON 对象属性值的 iterator。
  • 访问特定元素的操作(‘.[index]‘或’.[attributename]’)。用来访问数组元素或者 JSON 对象的属性值。输出是单个值
  • 数组切片操作(‘.[startindex:endindex]’),其行为类似于 python 语言中数组切片操作。
#访问特定属性的值
$ jq '.[0]."desc"'<test.json
"无名侠客"
$ jq '.[0].desc'<test.json
"无名侠客"$ jq '.[0]'<test.json #索引操作
{"id": 1,"name": "zhangsan","age": 24,"desc": "无名侠客","company": ["baidu","google","alibaba"]
}
$ jq '.[].name'<test.json #遍历输出所有的姓名(迭代器)
"zhangsan"
"lisi"
$ jq '.[0].company[0:2]'<test.json #切片操作
["baidu","google"
]

④使用jq串行解析和显示json中的多个字段

test.json文件

[{"id": 1,"name": "zhangsan","age": 24,"desc": "无名侠客","company": ["baidu","google","alibaba"]},{"id": 2,"name": "lisi","age": 18,"desc": "勇往直前","company": ["tencent","google","bytedance"]}
]

现在有test.json文件,我们需要使用jq,连续显示名字和年龄,效果如下

zhangsan 24
lisi     18

操作:

$ jq  '.[] | "\(.name) \(.age)"' <test.json
"zhangsan 24"
"lisi 18"

如何把双引号去掉呢,加上-r参数

$ jq  -r '.[] | "\(.name) \(.age)"' <test.json
zhangsan 24
lisi 18

⑤并行显示多个字段,用,同时使用多个表达式

样本数据

➜ ~ jq  .<test.json
[{"id": 1,"name": "zhangsan","age": 24,"desc": "无名侠客","company": ["baidu","google","alibaba"]},{"id": 2,"name": "lisi","age": 18,"desc": "勇往直前","company": ["tencent","google","bytedance"]}
]

,多个表达式组合的不同效果

➜ ~ jq '.[0].desc,.[0].name'<test.json
"无名侠客"
"zhangsan"
➜ ~ jq '.[0].desc,.[1].name'<test.json
"无名侠客"
"lisi"
➜ ~ jq '.[].desc,.[].name'<test.json
"无名侠客"
"勇往直前"
"zhangsan"
"lisi"

linux下的json解析工具jq的使用笔记相关推荐

  1. linux 下查看json 文件 使用jq工具

    cat <json_name> | jq (需要json文件在当前文件夹中) 查看当前文件夹有多少张图片 ls -lhR | grep '.jpg' |wc -l

  2. jq linux下载文件,linux下的json命令行工具–jq

    jq是一个很轻量却很强大的命令行下的json解析器.jq是json中的"sed"命令,它可以用来slice.filter.map.transform json数据.jq是用C编写的 ...

  3. linux shell json解析命令 jq 简介

    jq简介 jq可以对json数据进行分片.过滤.映射和转换,和sed.awk.grep等命令一样,都可以让你轻松地把玩文本.它能轻松地把你拥有的数据转换成你期望的格式,而且需要写的程序通常也比你期望的 ...

  4. Linux下USB抓包工具UsbMon的使用和包数据格式解析

    Linux下USB抓包工具UsbMon的使用和包数据格式解析 一.UsbMon的使用步骤 1.挂载debugfs 2.加载usbmon模块 3.确认usbmon是否可用 4.确认usb设备挂在哪条总线 ...

  5. c json保存整型数组_命令行JSON解析神器jq

    我们都知道现在JSON是最常用的配置和数据交换格式之一,尤其是大量的系统API接口现在基本上都是以JSON格式显示结果.JSON(JavaScript Object Notation) 是一种轻量级的 ...

  6. shell里的json超级工具 jq 高级用法介绍

    Linux shell 环境下有个和google Gson 一样好用的JSON 数据处理工具jq. 最近发现用jq 来分析提取数据,简直太好用了,特别是用于处理shell环境下面的复杂数据结构时,显的 ...

  7. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  8. [Android开发] Json解析工具类,一个类搞定Json的解析

    一.简介 利用递归的方式反射解析到bean里面 二.详细代码 1. Json格式 例如服务器指定规定json格式为: {"code": "--" , // 返回 ...

  9. Linux下的数据备份工具rsync

    Linux下的数据备份工具很多,用得最多的是rsyns(远程同步) 同步远程数据类似scp 同步本地数据类似cp root@ip-172-31-8-212:~# rsync /etc/passwd / ...

  10. Linux下查看进程IO工具iopp

    Linux下的IO检测工具最常用的是iostat,不过iostat只能查看到总的IO情况.如果要细看具体那一个程序点用的IO较高,可以使用iotop .不过iotop对内核版本和Python版本有要求 ...

最新文章

  1. java队列queue的我觉得很好的使用方式
  2. css样式 数据展示,教程:使用CSS设置数据样式
  3. HTML带有圆点的列表,HTML 列表
  4. 回文字符串—回文子串—Manacher算法
  5. 页面滚动时触发图片逐帧播放_如何在滚动效果上创建逐帧运动图像
  6. androidStudio导入库文件
  7. python怎么读取csv文件-Python如何读取csv文件
  8. 8音度dsp调音教程_特伦诗DSP电脑调音教程 8音度DSP调音软件使用认知连载一
  9. 《白帽子讲web安全》学习笔记——web安全概述
  10. SEO的日常主要工作做哪些
  11. MySQL 案例实战--MySQL数据库主从复制
  12. 《21世纪资本论》阅读摘要
  13. 商业银行2022年12月升级UKEY证书后故障
  14. Typhoon-v1.02 靶机入侵
  15. Jmeter接口压力测试(先登录再测接口)
  16. wampserver下载及用法
  17. 【Pygame】细致讲解开发Flappy Bird小游戏
  18. 歌曲:精忠报国 歌手:屠洪刚
  19. 回文联对联大全_回文联
  20. 2019.2.20《菜根谭》洪应明 明朝

热门文章

  1. 高分六号WFV预处理详细步骤(辐射校正、大气校正、几何校正)
  2. Microsoft DirectX组件v11.0完整版更新啦
  3. Tuxedo中间件学习
  4. 软件测试和初级会计哪个简单,2018年初级会计app刷题哪个好?
  5. 浅析微信支付:商户平台开通现金红包、指定用户发放、红包记录查询
  6. java面试题-基础篇(万字总结,带答案,面试官问烂,跳槽必备)
  7. MMF与WAV格式的铃声制作全过程
  8. Nero 9官方正版下载(自带正版序列号)-最好的中文免费刻录软件
  9. Faster-RCNN.Pytorch的使用
  10. 动软代码生成器的具体使用方法步骤