概述
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
jq可以对json数据进行分片、过滤、映射和转换,和sed、awk、grep等命令一样,都可以让你轻松地把玩文本。q是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行。
安装
macOS
ubuntu
centos
也可直接到官网下载安装。
基础使用
注:json
数组的键命名必须为下划线”_”,不能为”-“,否则解析不了。
更多的高级使用, 请查看官方使用手册。
单个值获取
- 语法:
jq '.key'
jq '.key?'
jq '.["key1", "key2"]'
- 解析不存在的元素,会返回null。
1 2
| {"foo": 42, "bar": "data"}
|
1 2 3 4 5 6 7 8
| # 输出结果为 42 cat data.json | jq '.foo' # 输出结果为 null cat data.json | jq '.foo2' # 输出结果为 42 "data" cat data.json | jq '.["foo", "bar"]' cat data.json | jq '.foo?, .bar?' cat data.json | jq '.foo, .bar'
|
嵌套解析
1 2
| {"foo": 42, "bar": {"data": 666}}
|
1
| cat data.json | jq '.bar.data' # 输出结果为 666
|
解析数组/字符串
1 2 3 4 5
| cat data.json | jq '.[0]' # 结果为1 cat data.json | jq '.[5]' # 结果为null cat data.json | jq '.[2:5]' # 结果为[3,4,5] cat data.json | jq '.[:3]' # 结果为[1,2,3] cat data.json | jq '.[-2:]' # 结果为[4,5]
|
移除数组结果的 []
1 2
| {"foo": [1, 2, 3], "bar": [4, 5]}
|
1 2
| cat data.json | jq '.foo' # 输出结果为 [1, 2, 3] cat data.json | jq '.foo' | jq '.[]' # 输出结果为 1 2 3
|
获取某个Key对应的数组内容
1 2
| {"user":"stedolan", "projects": ["jq", "wikiflow"]}
|
1
| cat data.json | jq '.projects[]' # 输出结果为 "jq" "wikiflow"
|
获取值并进行数学运算
1
| cat data.json | jq '(.[0] + 2) * 5'
|
获取json对象的长度
1 2
| [[1,2], "string", {"a":2}, null]
|
1
| cat data.json | jq '.[] | length' # 结果为 2 6 1 0
|
获取JSON中的key元素的,查找json中所有的键
1
| cat data.json | jq 'keys'
|
1 2 3
| {"abc": 1, "abcd": 2, "Foo": 3} [42, 3, 35]
|
判断是否存在某个key
1 2
| {"foo": 42, "bar": "data"}
|
1 2
| cat data.json | jq 'has("foo")' # 输出结果为 true cat data.json | jq 'has("abc")' # 输出结果为 false
|
判断key是否存在json对象中
判断是否在Map对象中
1
| cat data.json | jq '.[] | in({"foo": 42})' # 输出结果为 true false
|
判断是否存在数组对象中
1
| cat data.json | jq 'map(in([0, 1]))' # 输出结果为 false true
|