Linux JSON 格式化工具 - `jq`

JSON-JavaScript Object Notation 是一种轻量级的数据交换格式。由于其简单、便于阅读、便于编写的特性,逐渐替代了一部分xml的职责在数据交换领域占有一定地位,绝大部分的语言也都提供了对JSON文本的解析,详细可阅读:什么是JSON各主流语言的JSON解析代码

Linux 平台上处理文本的工具堪称是经典,例如:sedawkgrepfind…,但如果返回结果是 JSON 格式,使用上述提到的文本处理工具也可以获取到对应的值,但成本稍微复杂一点(并且还有可能不准确),如下:

jq-use-awk-to-get-json-value.png

在桌面系统中,我们可以通过一些网站提供的工具(如:http://json.cn/)或浏览器插件(FeHelper)可以很方便的解析 JSON 数据并快速得到我们想要的结果。

但是在 Shell 编程中,就需要自己通过grepawksed等工具组合进行“曲线救国”了,非常麻烦且匹配出来的结果有时还不太准确!后来在网上一搜…好家伙,原来jq这个工具从 2013 年就出来了,真是孤陋寡闻了!

正如 jq 的官网所说:jq是一个用 C 语言编写的独立没有任何依赖的开源工具,你可以使用 jq 来切割、过滤、映射和转换 JSON 结构化数据,而可以用 sedawkgrep更加轻松、专注、友好的处理文本。

使用

  1. jq 中英文状态下的点号-.表示整个JSON结构(还可以通过管道将父级节点)
  2. 获取对象的值:.key
  3. 获取数组的值:.key[0]

格式化 json 文本

JSON 实际只是一种特殊格式的字符串,有些情况下服务器返回的数据虽然是 JSON 的,但是如果响应头中的 Content-Type 不是 application/json,那么客服端是不会进行美化打印的。可以通过管道将 JSON 格式的文本传给 jq 进行格式化打印输出。

echo '{"text":"这是一个json格式的文本"}' | jq .

jq-format-json.png

获取对象的值

jq-get-object-json.png

获取数组的值

# 获取数组下所有的 `name` 属性值
echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[].name'

# 获取数组下所有的 `name` 属性值 ==> 利用管道将父节点作为 `JSON` 整个节点
echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[] | .name'

# 获取指定数组下`name`属性
echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[0].name'

jq-get-array-json.png

自定义输出数组

curl -s http://httpbin.org/anything | jq '. | {"方法": .method, "链接": .url}'

jq-customer-output-json.png

压缩 JSON 为字符串

curl -s http://httpbin.org/anything | jq -c

jq-zip-json-to-string.png

转载请声明出处: MinsonLee的博客:https://minsonlee.github.io

扫描下方二维码,关注公众号,接收更多实时内容

新猿呓码

打赏一个呗

取消

感谢客官打赏,您的打赏使我动力十足!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦