工具| jq 玩转JSON数据的利器

一简介

JSON是计算机程序通讯的一种常见格式。在我们日常运维或者开发过程中经常需要解析json文件 ,但是部分文件内容有非常不利于人工阅读。如何解决呢?jq来帮忙。

jq 是一款基于命令行处理 JSON 数据的工具。其可以接受标准输入,命令管道或者文件中的 JSON 数据,经过一系列的过滤器(filters)和表达式的转后形成我们需要的数据结构并将结果输出到标准输出中,从而帮助我们很好的解析json数据。

二 如何使用

2.1 安装

linux 平台一般直接

yum install -y jq

macOS

brew install jq

2.2 用法

jq - commandline JSON processor [version 1.5]
Usage: jq [options] <jq filter> [file...]
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>;
    See the manpage for more options.

需要说明的是 jq 只能接受标准的 JSON 字符串作为输入内容。也就是说输入内容必须严格遵循 JSON 格式的标准。所有的属性名必须是以双引号包括的字符串。对象的最后一个属性的末尾或者数组的最后一个元素的末尾不能有逗号。否则 jq 会抛出无法解析 JSON 的错误。

$ jq . test.json
parse error: Invalid numeric literal at line 2, column 8

2.3 基础表达式

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

'.' 符号。单独的一个'.'符号用来表示对作为表达式输入的整个 JSON 对象的引用。 JSON 对象操作。jq 提供两种基本表达式用来访问 JSON 对象的属性:'.'和'.?'。

正常情况下,这两个表达式的行为相同:都是访问对象属性,如果 JSON 对象不包含指定的属性则返回 null。区别在于,当输入不是 JSON 对象或数组时,第一个表达式会抛出异常。第二个表达式无任何输出。

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

迭代器操作('.[]'). 该表达式的输入可以是数组或者 JSON 对象。输出的是基于数组元素或者 JSON 对象属性值的 iterator。

  • 迭代器操作('.[]'). 该表达式的输入可以是数组或者 JSON 对象。输出的是基于数组元素或者 JSON 对象属性值的 iterator。
  • 访问特定元素的操作('.[index]'或'.[attributename]')。用来访问数组元素或者 JSON 对象的属性值。输出是单个值。
  • 数组切片操作('.[startindex:endindex]'),其行为类似于 python 语言中数组切片操作。表达式操作(','和 '|')。

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

常见的用法test.json 的内容

{ "key1": "v1"} { "key2": "v2","key3": "v3"}

格式化json输出

$ jq  '.' test.json
{
"key1": "v1"
}
{
"key2": "v2",
"key3": "v3"
}

当然也可以使用

cat test.json| jq '.'

查看其中某个字段数据

如果一个文件内容比较多,只是想看其中的一部分数据或者某个key的数据

jq '.key'

如果没有对应的key 则显示为null 。

$ cat  test.json | jq -r '.key1'
v1
null

文件内容是数组,访问其中某个元素

例如我们要查看1.json其中的数据key 为key1 的数据

$ cat 1.json
[{ "key1": "v1"} ,{ "key2": "v2","key3": "v3"}]
$  cat  1.json| jq '.[0]'### 获取数组中的指定元素
{
"key1": "v1"
}

$  cat  1.json| jq '.[0].key1'## 获取指定key 对应的value
"v1"

内建函数

jq还有一些内建函数如 keys,has

$ cat test.json
{ "key1": "v1"} {"key2": "v2","key3": "v3"}
$  cat  test.json  | jq 'has("key1")' ## 判断是否有指定的key
true
false

获取test.json 所有的key

$  cat  test.json  | jq 'keys'
[
"key1"
]
[
"key2",
"key3"
]

三 总结

当然 关于jq 还有非常多的高阶 用法,感兴趣的朋友可以去 阅读原文 查看官方文档去探索更多好玩的用法。

参考文章

https://www.ibm.com/developerworks/cn/linux/1612_chengg_jq/index.html

-The End-


本文分享自微信公众号 - yangyidba(yangyidba)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券