JSON-JavaScript Object Notation 是一种轻量级的数据交换格式。由于其简单、便于阅读、便于编写的特性,逐渐替代了一部分xml的职责在数据交换领域占有一定地位,绝大部分的语言也都提供了对JSON文本的解析,详细可阅读:什么是JSON、各主流语言的JSON解析代码。
Linux 平台上处理文本的工具堪称是经典,例如:sed、awk、grep、find…,但如果返回结果是 JSON 格式,使用上述提到的文本处理工具也可以获取到对应的值,但成本稍微复杂一点(并且还有可能不准确),如下:

在桌面系统中,我们可以通过一些网站提供的工具(如:http://json.cn/)或浏览器插件(FeHelper)可以很方便的解析 JSON 数据并快速得到我们想要的结果。
但是在 Shell 编程中,就需要自己通过grep、awk、sed等工具组合进行“曲线救国”了,非常麻烦且匹配出来的结果有时还不太准确!后来在网上一搜…好家伙,原来jq这个工具从 2013 年就出来了,真是孤陋寡闻了!
正如 jq 的官网所说:jq是一个用 C 语言编写的独立没有任何依赖的开源工具,你可以使用 jq 来切割、过滤、映射和转换 JSON 结构化数据,而可以用 sed、awk、grep更加轻松、专注、友好的处理文本。
jq的官网:https://stedolan.github.io/jq/jq的指南:https://stedolan.github.io/jq/tutorial/jq的手册:https://stedolan.github.io/jq/manual/jq的安装:https://stedolan.github.io/jq/download/ 【安装完毕后可以通过jq -V验证是否安装成功】
使用
- 在
jq中英文状态下的点号-.表示整个JSON结构(还可以通过管道将父级节点) - 获取对象的值:
.key - 获取数组的值:
.key[0]
格式化 json 文本
JSON 实际只是一种特殊格式的字符串,有些情况下服务器返回的数据虽然是 JSON 的,但是如果响应头中的 Content-Type 不是 application/json,那么客服端是不会进行美化打印的。可以通过管道将 JSON 格式的文本传给 jq 进行格式化打印输出。
echo '{"text":"这是一个json格式的文本"}' | jq .

获取对象的值

获取数组的值
# 获取数组下所有的 `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'

自定义输出数组
curl -s http://httpbin.org/anything | jq '. | {"方法": .method, "链接": .url}'

压缩 JSON 为字符串
curl -s http://httpbin.org/anything | jq -c



