jq是一个Liunx系统上针对JSON处理的工具,它接收一个输入,然后生成一个输出。有许多内置过滤器用来提取对象的特定字段,或者将数字转为字符串,或者执行各种其他的标准任务。
可以使用命令行选项来影响jq如何读写输入和输出,有很多,这里只选择几个自认为常用的,下面的示例用将会以该json字符示例
# a.jsoncat
{"use_name": "xiaoMing","age": 12,"sex":"男"}
json格式查看
cat a.json | jq
#打印输出--------------
{
"use_name": "xiaoMing",
"age": 12,
"sex": "男"
}
-S,顺序输出
将json的各个字段按照key排序输出
cat a.json | jq -S
# 打印输出--------------
{
"age": 12,
"sex": "男",
"use_name": "xiaoMing"
}
-r,去掉双引号输出
使用该命令,如果过滤器的结果是string,将会以标准输出,而不是 字符串的格式输出,该示例是获取json里的所有key
jq keys[] a.json
# 打印输出--------------
"age"
"sex"
"use_name"
# 加上-r 效果
jq -r keys[] a.json
age
sex
use_name
.
(点),最常用的过滤器,
一个JSON像map一样,键值对的形式存在,.age
即代表获取age对应的值,如果不存在则返回null
jq .age
# 打印输出--------------
12
[i]
通过索引访问元素,当JSON是数组对象时,可以使用索引下标的形式访问元素
jq '.[0]'
--------------------
Input [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
Output {"name":"JSON", "good":true}
i为负索引也是可以的,-1代表最后一个元素,-2代表倒数第二个元素。
.[]
则返回所有元素
给定一个索引范围返回元素,[2,4]
返回数组长度为3,包含了从2(包含)到4(不包含)的元素
jq '.[2:4]'
--------------------
Input ["a","b","c","d","e"]
Output ["c", "d"]
jq '.[:3]'
--------------------
Input ["a","b","c","d","e"]
Output ["a", "b", "c"]
jq '.[-2]'
--------------------
Input [1,2,3]
Output 2
|
管道,和Liunx的用法一样,将左边的结果,再拿到右边执行
jq '.[1] | .name'
--------------------
Input [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
Output “XML”
先获取索引为1的元素,再获name属性值
[]
可以用来构造数组,如[1,2,3]
,jq也可以用来输出一个数组。它是使用表达式将产生的结果收集到一个大数组里,用,
隔开每个元素表达式
jq '[.[0].name , .[1].goods]'
--------------------
Input [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
Output ["JSON", false]
获取索引为0的元素的name属性 和 索引为1的元素的good的属性
{}
构建一个json对象,又叫字典或者哈希,如{"a":23,"b":23}
。如果key由所有字母字符组成,在构建过程中引号可以省略。Value可以是任何复杂的表达式
基本构建
从两个对象取几个字段重新构建成一个json对象
jq '{name: .name , age: .age}'
Input {"name":"JSON", "good":true,"age":34}
Output {name: "JSON" , age: 34}
由于使用频繁,所以有一个快捷语法
jq '{name, age}'
value表达式返回多个值
如果其中的一个表达式生成多个结果,那么返回的对象将会多个,例如:
# 输入
{"user":"stedolan","titles":["JQ Primer", "More JQ"]}
# 命令
jq {user, title: .titles[]}
# 输出
{"user":"stedolan", "title": "JQ Primer"}
{"user":"stedolan", "title": "More JQ"}
如果是想title里也想输出数组的话,则使用
{user,tie:.titles}
要怎么理解这种用法,.titles[] 已经声明了这是个数组,.titles 则代表的是一个对象,只是这个对象是个数组。
key上使用表达式
刚才说过,在定义key的时候,双引号可以省略掉,那么如果key上也想使用表达式,则使用()
括号包裹,例如:
# 输入
{"user":"stedolan","titles":["JQ Primer", "More JQ"]}
# 命令
{(.user): .titles}
https://stedolan.github.io/jq/manual/
# 中文文档
https://github.com/alingse/jq-manual-cn/tree/master/manual/v1.5
https://blog.csdn.net/iamanda/article/details/122234695
https://blog.csdn.net/whatday/article/details/125397561