史上最全jq命令使用详解

  • 一. 前言
  • 二. 语法
    • 1. 使用语法
    • 2. 概念理解
  • 三. 主要用法
    • 1. 常见表达式含义
    • 2. 基本使用场景
    • 3. 重组
    • 4. 管道的使用
    • 5. 内置函数的使用
  • 四. 示例文件json.txt

一. 前言

本文价值千金, 阅读前请先收藏.

jq命令是处理json字符串的神器, 主要用于获取JSON属性/简单重组JSON字符串.

本章将详细介绍jq的主要应用场景, 帮助大家在平时工作中处理JSON的效率大大提升.

二. 语法

1. 使用语法

jq 表达式 处理源

处理源可以为文件路径或管道: 读取后必须为JSON对象, JSON数组, JSON对象流三类

2. 概念理解

  • JSON对象
    {开头, 以}结尾的JSON字符串, 形如{}示例:
{"productId": "2048200008352211","productName": "COACH蔻驰佩利系列 马车标识米兰编织链石英表"
}
  • JSON数组
    [开头, 以]结尾的JSON字符串, 元素间用,分隔
    包括基本数组和JSON对象数组, 形如[{},{},{}]

基本数组: 元素为基本数据类型, 如[1,2,3,5], [“shanghai”, “guangzhou”,“beijing”]
JSON对象数组: 元素为JSON对象, 略

  • JSON对象流
  1. 常规的JSON定义没有这种结构, 是jq命令支持的一种字符串结构类型
  2. 概念名字是我自己随便起的, 主要是方便理解
  3. JSON对象流和JSON数组有点类似: 是指多个连续的JSON对象组成的字符串, 没有[开头, 没有]结尾, 且元素间没有分隔符或以空格/换行来分隔, 形如{}{}{}, 示例如下:
  4. 特殊地, JSON对象流也可以是基本属性流, 如"a" "b" "c", 1 2 3
  5. 有些情况下JSON对象流无法转换成JSON数组, 通过sed命令转换
    jq '.' | sed 's/^\}/\},/' | sed '1s/.*/\[\{/' | sed '$s/.*/\}\]/
{"productId": "2048200008352211","productName": "COACH蔻驰佩利系列 马车标识米兰编织链石英表"}
{"productId": "2048200008352212","productName": "COACH蔻驰佩利系列 马车标识米兰编织链石英表2"}
{"productId": "2048200008352213","productName": "COACH蔻驰佩利系列 马车标识米兰编织链石英表3"}
  • 根对象
    是指jq命令当前处理的处理源的表达式引用, 在表达式中用.来表示

  • 表达式/路径
    jq命令是基于表达式输出结果的, 表达式可以通过.来访问子属性或子对象
    表达式的语法, 类似ognl表达式(对象导航语言)
    .order.address.city表示获取当前处理源order(子对象)下的address(子对象)的city属性

{"uid": 11603,"mobile": "172****1333","order": {"address": {"province": "上海市","city": "海市","distict": "浦东新区","line": "广兰路地铁站1号口"},"items": [{"itemId": 123,"itemName": "无人机1"},{"itemId": 124,"itemName": "无人机2"}]}
}

三. 主要用法

本文示例文件json.txt, 在文章最后

1. 常见表达式含义

. : 放在表达式开头, 用来表示.根对象, 也可用在属性之间作为访问路径的连接

.name: 输出指定属性,使用.连接的路径访问字段, 路径可用多层, 如order.items[0].itemId

.[下标] : 输出单个指定index的数组元素(从0开始)

.[下标1,下标2,..] : 输出多个指定数组元素, 结果为JSON对象流

express[] : 表达式expressJSON数组, 后面跟[]表示将express表示的JSON对象数组转换成JSON对象流, 形如: [{},{},{}]转换成{}{}{}

[表达式] : 将JSON对象流组合成JSON对象数组,形如: {}{}{}组装成[{},{},{}]

,:需要输出多个表达式的结果用来拼接各表达式, 如 jq '.name,.address.city' json.txt

| : 管道, 相对于运行两次jq命令, 前jq运行结果作为后jq的处理源
根据前jq的运行结果数据类型分为:
JSON对象: 可简化, 如jq '.[0]|.address' json.txtjq '.[0].address' json.txt
JSON对象数组: 后置表达式只能用内置函数, 如jq '.[0].arrayBrowser|length' json.txt
JSON对象流: 相当于对每个元素都运行后置表达式, 整体结果还是JSON对象流,
jq '.[0].arrayBrowser[]|.name' json.txt

注意:

要想对JSON对象数组每个元素进行处理, 必须先转换成JSON对象流

2. 基本使用场景

jq '.' json.txt – 格式化

jq '.[0].address.city' json.txt --获取指定字段的值(可嵌套)

jq '.[0].name,.[0].url' json.txt --使用逗号分隔,取多个字段的值;返回值以换行分隔

jq '.[0].arrayBrowser[0]' json.txt --提取数组的单个元素

jq '.[0].arrayBrowser[0,1]' json.txt --提取数组的多个元素

jq '.[0].arrayBrowser[]' json.txt – 提取数组的全部元素转换成JSON对象流

jq '[.data.results[]|{topicId,viewCount}]' hjsource.json – 提取数组的指定属性

jq '[.data.results[]|{id:topicId,count:viewCount}]' hjsource.json – 提取数组的指定属性并重命名

注意:

上述最后两个示例
先将JSON对象数组转化成JSON对象流, 再对各元素进行处理, 再组装成JSON对象数组

3. 重组

  • 场景: 重组成对象
  1. 使用方法一: 组装时仅复用value

jq '{simpleName:.[0].name,postUrl:.[0].url}' json.txt , 得到结果 :

{"simpleName": "站长工具","postUrl": "http://tool.chinaz.com"
}

比较下和jq '.[]|{simpleName:.name,postUrl:.url}' json.txt 的区别.

(前者处理单个对象, 后者处理JSON对象流)

  1. 使用方法二: 组装时复用整个key-value

运行jq '.[0]|{name,url}' json.txt , 得到结果:

{"name": "站长工具","url": "http://tool.chinaz.com"
}

比较下和 jq '.[]|{name,url}' json.txt 的区别.

(前者处理单个对象, 后者处理JSON对象流)

注意:

  1. 引用的key-value可以是基本属性节点, 也可以是对象节点.

    如运行jq '.[0]|{name,address}' json.txt

  2. 复用key-value时表达式前面没有.前缀, 仅复用value时才有.前缀

  3. ,分隔的多个表达式没必要任何关系, 层次也可不一样

  • 场景: 重组成数组

在表达式外边套上[], 即可组装成数组. 根据组合元素的不同, 可以分以下三类:

  1. 重组的元素可以是基本属性, 组合结果是组装成基本属性的数组
  2. 重组的元素可以是单个json对象, 组合结果是在外面套个数组结果
  3. 重组的元素可以是单个JSON对象流, 组合结果是转化成JSON对象数组
  4. 有些情况下JSON对象流无法转换成JSON数组, 通过sed命令转换
    jq '.' | sed 's/^\}/\},/' | sed '1s/.*/\[\{/' | sed '$s/.*/\}\]/
  1. 重组元素为基本属性

运行 jq '[.[0].name,.[0].url]' json.txt, 得到结果:

["站长工具","http://tool.chinaz.com"
]
  1. 重组元素为单个json对象

运行 jq '[.[0].address]' json.txt , 得到结果:

[{"city": "厦门","country": "中国"}
]

运行 jq '[.[0].arrayBrowser]' json.txt , 得到结果:

[[{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"}]
]
  1. 重组元素为JSON对象流

jq '[.[]|.arrayBrowser[]]' json.txt, 得到结果:

[{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"},{"name": "360","url": "http://www.so.com"},{"name": "bing","url": "http://www.bing.com"}
]

4. 管道的使用

管道|的作用, 把管道前的处理结果作为管道后面处理的输入. 相当于管道前后各运行一次jq命令. (管道可以多次使用)

用法和前面的没有区别. 略

5. 内置函数的使用

  • 获取json对象的所有key组成的数组

命令格式: jq keys , 表达式只能是keys , 不能包含其他语法, 如果需要获取嵌套对象keys, 通过管道即可.

运行 jq '.[0]|keys' json.txt , 得到结果:

["address","arrayBrowser","name","url"
]
  • 获取length

命令格式: jq length , 表达式只能是length , 不能包含其他语法, 如果需要获取嵌套对象length, 通过管道即可.

  1. 如果处理对象是基本属性, 则length返回其字符个数. 如jq '.[0].name|length' json.txt , 结果为4.

  2. 如果处理对象是json对象, 则length返回其属性个数. 如jq '.[0].address|length' json.txt, 返回2.

  3. 如果处理对象是数组, 则length返回数组的长度. 如jq '.[0].arrayBrowser|length' json.txt , 得到2.

  • 删除某属性

命令格式: jq del(属性表达式) , 一般结合管道使用

该属性可以是基本属性, 或json对象, 或数组

运行 jq '.[0]|del(.address)|del(.arrayBrowser)' json.txt , 得到结果:

{"name": "站长工具","url": "http://tool.chinaz.com"
}
  • 设置元素值

命令格式: jq 属性表达式=新的值' , 一般结合管道使用

新的值可以是基本属性, json对象, 数组.(双引号不能省略)

运行 jq '.[0]|.name="myTool"' json.txt, 得到结果:

{"name": "myTool","url": "http://tool.chinaz.com","address": {"city": "厦门","country": "中国"},"arrayBrowser": [{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"}]
}
  • 增加属性

命令格式: jq 属性表达式+{新的节点} , 一般结合管道使用

其中属性表达式的结果必须为对象

新的节点只能是基本属性, 不能是对象, 数组.

运行jq '.[0].address+{version:"1.0"}' json.txt, 得到结果:

{"city": "厦门","country": "中国","version": "1.0"
}
  • 判断是否有某属性
    jq '.[0]|has("name")' json.txt, 返回结果为true
    jq '.[]|.arrayBrowser[]|has("name")' json.txt #判断单个属性
    jq '.[]|.arrayBrowser[]|{a:has("sign"),b:has("name")}' json.txt #判断多个属性并组装成JSON对象
  1. 其中属性要用""包裹
  2. 只能判断子属性, 不能判断后代属性
  3. 处理源可以为JSON对象JSON对象流

四. 示例文件json.txt

[{"name": "站长工具","url": "http://tool.chinaz.com","address": {"city": "厦门","country": "中国"},"arrayBrowser": [{"name": "Google","url": "http://www.google.com"},{"name": "Baidu","url": "http://www.baidu.com"}]},{"name": "站长之家","url": "http://tool.zzhome.com","address": {"city": "大连","country": "中国"},"arrayBrowser": [{"name": "360","url": "http://www.so.com"},{"name": "bing","url": "http://www.bing.com"}]}
]

处理JSON最强命令jq使用详解相关推荐

  1. ownCloud/Nextcloud OCC命令行工具详解

    OCC命令行工具详解 ownCloud/Nextcloud OCC命令行工具详解(1) ownCloud/Nextcloud OCC命令行工具详解(2) ownCloud/Nextcloud OCC命 ...

  2. Linux命令--tree--使用/详解/实例

    原文网址: 见:Linux命令--tree--使用/详解/实例_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍Linux的tree命令的用法. tree命令可以以树状结构查看目录结构. 选项 ...

  3. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  4. 【转】Linux命令工具 top详解

    Linux命令工具 top详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不 ...

  5. Linux中history历史命令使用方法详解

    在/etc/profile里添加如下:#History export HISTTIMEFORMAT="[%F %T]" HISTDIR=/home/common/.hist if ...

  6. java json解析 代码_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  7. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  8. Linux下fdisk命令操作磁盘详解--添加、删除、转换分区

    linux下fdisk命令操作磁盘详解--添加.删除.转换分区等 fdisk 操作硬盘的命令格式如下: [root@localhost beinan]# fdisk 设备 比如我们通过 fdisk - ...

  9. php json.parse,JSON.parse()与JSON.stringify()和eval()使用方法详解

    这次给大家带来JSON.parse()与JSON.stringify()和eval()使用方法详解,JSON.parse()与JSON.stringify()和eval()使用的注意事项有哪些,下面就 ...

最新文章

  1. C#各种加密算法的研究
  2. SharePoint 2013 APP 开发示例 系列
  3. python百度网盘_百度网盘突然大调整,网友炸了..
  4. Web安全实践(13)嗅探,arp欺骗,会话劫持与重放攻击(上)
  5. linux 编译git 客户端源码然后安装
  6. mvc html.display,Asp.Net MVC中的Html.DisplayFor()用于项目列表
  7. 无法连接上 cn.archive.ubuntu.com:80 (123.129.214.98)。 - connect (111: 拒绝连接)
  8. python numpy和pandas库的区别_python – 来自熊猫和numpy的意思不同
  9. SpringBoot - 工作流Activiti开发
  10. 如何把项目部署到云服务器上,如何把项目部署到云主机
  11. flink 任务执行类的加载
  12. Diino - 具有自动数据备份功能的国外2G免费网络硬盘
  13. 周鸿祎重申360不依靠弹窗广告盈利 增值服务是主要模式
  14. 软件开发需要学习哪些技术?
  15. 人性的弱点-读书笔记
  16. ODC V3.2.0 新版本发布 | 着重用户体验,挑战权限管控业务场景
  17. 鸿海成立AI研发中心 5年投资100亿新台币
  18. 硬件工程师基础知识(http://huarm.taobao.com/ )
  19. VMware运行虚拟机卡慢等解决办法
  20. ubuntu下查看电脑系统信息

热门文章

  1. 全球及中国M2M组件行业需求规模与投资效益预测报告2022~2027年
  2. 生产过程监控没有你想象那么难!
  3. java语言的三个版本是_Java是一个全面且功能强大的语言,可用于多种用途。Java有三个版本分别是:_学小易找答案...
  4. Arduino基础1
  5. 回滚机制有多少种?它们的实现原理是什么?这些你确定都知道?
  6. Unity2019新建空项目都报错(有两个看不到的红色报错)怎么解决?
  7. Python入门基础-六、案例3 基础代谢率(BMR)计算器 #Python中常用的数值类型#字符串分割与格式化输出#异常处理机制
  8. 分布式定时任务中间件
  9. window脚本介绍
  10. [构造]Repetitions Decoding Codeforces1642D