概述

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

jq可以对json数据进行分片、过滤、映射和转换,和sed、awk、grep等命令一样,都可以让你轻松地把玩文本。q是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行。

安装

  • macOS

    1
    brew install jq
  • ubuntu

    1
    sudo apt-get install jq
  • centos

    1
    sudo yum install jq
  • 也可直接到官网下载安装。

基础使用

注:json 数组的键命名必须为下划线”_”,不能为”-“,否则解析不了。

更多的高级使用, 请查看官方使用手册

单个值获取

  • 语法: jq '.key' jq '.key?' jq '.["key1", "key2"]'
  • 解析不存在的元素,会返回null。
1
2
// 假设Json文件内容
{"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
// 假设Json文件内容
{"foo": 42, "bar": {"data": 666}}
1
cat data.json | jq '.bar.data'	# 输出结果为 666

解析数组/字符串

1
2
// 假设Json文件内容
[1, 2, 3, 4, 5]
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]

移除数组结果的 []

  • 语法: jq '.[]'
1
2
// 假设Json文件内容
{"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对应的数组内容

  • 语法: jq '.key[]'
1
2
// 假设Json文件内容
{"user":"stedolan", "projects": ["jq", "wikiflow"]}
1
cat data.json | jq '.projects[]'	# 输出结果为 "jq" "wikiflow"

获取值并进行数学运算

1
2
// 假设Json文件内容
[1, 2, 3, 4, 5]
1
cat data.json | jq '(.[0] + 2) * 5'

获取json对象的长度

1
2
// 假设Json文件内容
[[1,2], "string", {"a":2}, null]
1
cat data.json | jq '.[] | length'	# 结果为 2 6 1 0

获取JSON中的key元素的,查找json中所有的键

  • 语法: jq 'keys'
1
cat data.json | jq 'keys'
1
2
3
// 假设Json文件内容
{"abc": 1, "abcd": 2, "Foo": 3} // 输出结果为 ["Foo", "abc", "abcd"]
[42, 3, 35] // 输出结果为 [0, 1, 2]

判断是否存在某个key

  • 语法: jq 'has("key")'
1
2
// 假设Json文件内容
{"foo": 42, "bar": "data"}
1
2
cat data.json | jq 'has("foo")'	# 输出结果为 true
cat data.json | jq 'has("abc")' # 输出结果为 false

判断key是否存在json对象中

  • 判断是否在Map对象中

    1
    2
    // 假设Json文件内容
    ["foo", "bar"]
    1
    cat data.json | jq '.[] | in({"foo": 42})'	# 输出结果为 true false
  • 判断是否存在数组对象中

    1
    2
    // 假设Json文件内容
    [2, 0]
    1
    cat data.json | jq 'map(in([0, 1]))'	# 输出结果为 false true