一 JSON
(1)什么是json
1) JSON 是最常用的'配置'和'数据交换'格式之一,全称JavaScript Object Notation
特点: 一种与'开发语言无关-->独立于语言的文本格式'的、'轻量级'的数据存储格式
场景: 大量的系统'API接口'现在基本上都是以'JSON格式'显示结果
2) 一种数据格式的'标准规范-->事实标准'
备注:起初'来源'于'js'这门语言,后来随着使用的广泛,几乎'每门开发语言'都有处理JSON的API
3) 优点:易于人的'阅读'和'编写',易于机器'解析'与'生成'
(2)数据类型
数据结构:object-->'{}'、array-->'[]'
基本类型:string、number、true、false、null -->'6种'
后续: null和'空串'的区别
1) 一个'花括号'{},整个代表一个对象-->'object'
特点: 里面的元素必须是'key:value',以','隔开
补充: 对象是一个'无序'的'key/value对'集合
2) 一个'方括号'[],整个代表一个数组-->'array'
特点: 数组是'值'的'有序'集合,值之间以','分割
补充: '值'可以是"双引号"包括的string、number、true、false、null、object、arrary
理解: 'value'是广义上的'单个元素',可以'通过'{}、'[]'嵌套来'实现'复杂的数据结构
3) json仅支持'UTF-8'编码,且不支持'注释'
(3)基础
key: 一般是'string'类型,用"双引号"!!!
强调: 不是'单引号'!!!
补充: 双引号包括的字符串能解析"\t、\n"等符号
value:'任何'基本类型或数据结构
细节: 最后一个'不要加逗号',加了会'出错'
(4)高级
核心:数据结构之间的'嵌套'
场景:很多时候,服务器返回的JSON都"不是一个扁平"的结构,而是'包含了各种嵌套'
强调:一般'json结构'保持一样
理解: 类似于C的'struct'结构体,自己'自由'组合
① 对象封装数组
② 数组作为JSON根对象
③ 纯数组中的对象带有唯一key
④ 更一般形式
二 jq
在自动化部署中涉及到shell脚本需要'动态读取'很多'配置文件',最好是'json格式'
(1)各种语言处理json
(2)jq简介
1) jq是一个'出色'的命令行'针对-->JSON处理器',提供了用于查询、操作和使用JSON文件的大量功能,而且作为一个'命令行工具',可'配合UNIX管道'使用,'单行脚本'处理JSON
2) jq可以对json数据进行'分片'、'过滤'、'映射'、'转换';和sed、awk、grep等命令一样,可以让你'轻松'地把玩文本
3) 它能'轻松地'把你拥有的数据'转换成'你期望的格式,而且需要写的程序通常也'比你期望'的更加简短
4) jq是用'C编写','没有'运行时依赖,所以几乎可以运行在'任何系统'上
5) 预编译的二进制文件可以'直接在'Linux、OS X和windows系统上运行
注意:jq'不是'曾经流行的'JS库'Jquery的'缩写'
(3)jq安装
1) Debian、'Ubuntu'系:sudo apt-get install jq
2) Redhat、'Centos'系:sudo yum install jq -->'7' 或 sudo dnf install jq -->'8'
备注:当前'采用'-->'Centos7.7'
3) openSUSE:sudo zypper install jq
4) Arch:sudo pacman -Sy jq
5) Mac OS:使用'Homebrew安装'-->brew install jq
5) Windows:使用Chocolatey NuGet或者直接下载'官方二进制包'
chocolatey install jq
(4)jq实践
① json数据格式化
最'简单'的jq程序是表达式".",它'不改'变输入,但可以将其'优美地输出',便于'阅读'和理解
直接'格式化'打印
+++++++++'所作的事情'+++++++++
1)'首先'检查json'语法格式' -->'不符合'则'报错'
2)'然后'格式'正确',会进行'format格式化'
curl -s -o example.json https://api.github.com/users/jianzhiwang/repos
② jq命令详解
jq [options] filter [files]
1) **options:**
--version: 输出'jq的版本信息'并退出
--slurp/-s: 读入'整个输入'流到一个'数组'
--raw-input/-R: '不作为JSON解析',将每一行的文本作为字符串'输出到屏幕'
--null-input/ -n: 不读取任何输入,过滤器运行使用null作为输入;一般用作'从头构建JSON'数据
--compact-output /-c:使输出紧凑,而'不是'把每一个JSON对象'输出在一行'
--colour-output / -C:打开'颜色'显示
--monochrome-output / -M:关闭颜色显示
--ascii-output /-a: 指定'输出格式'为ASCII
-raw-output /-r : 如果过滤的结果是一个字符串,那么直接写到标准输出(去掉字符串的引号)
2) **filter:**
. : 默认'输出'
.foo: 输出指定'属性',foo代表属性。
.[foo] : 输出指定'数组元素',foo代表'数组下标'
.[]: 输出指定数组中'全部元素'
, : 指定'多个属性'作为过滤条件时,用'逗号分隔'
| : 将指定的数组元素中的'某个属性'作为'过滤条件'
3) **files:**
JOSN格式文件
③ 直接取map的某个key对应的value
备注: 'map'可以理解为'object'-->元素是"key":"value"的形式
④ 获取第一个数组的元素
jq 的键查询也支持'链式调用'
⑤ 获取所有的数组元素
jq '.list[].meta' ceshi7.json
[]中如果'为空'表示获取所有的'数组元素' -->'有层级'
过滤'多个值'-->'以逗号隔开'
echo '[{"a":1,"b":2},{"c":3,"d":4}]' | jq .[0,1]
备注: 多个键搜索,中间用'逗号'分开
⑥ jq相关参数
uesr_name代表键,$name代表name这个变量即前面的okok,这个变量可以是'交互型'的
'-c'选项:该选项控制 jq 是输出 'raw 格式'内容或 json 格式化'pretty'内容
'-r'选项:去掉字符串的引号'"'
⑦ 重组
1) 数据重'组成数组'-->"[]"
echo '{"a":1,"b":2,"c":3,"d":4}' | jq '[.a,.b]'
2) 数据重'组成对象'-->"{}"
echo '{"a":1,"b":2,"c":3,"d":4}' | jq '{"tmp":.b}'
⑧ 管道线|
jq'支持'管道线 |,它'如同'linux命令中的管道线,把'前面命令的输出'当作是'后面命令的输入'
eg:如下命令把'.[0]作为{…}的输入',进而'访问嵌套'的属性
备注:这里我们使用管道'过滤'并'构造'出meta对象
补充: 也是'重组'
细节: { key} -->'将key和key对应的value组成map'
jq '.[0] | {name:.arrayBrowser[1].name,city:.address.city}'
注意: '|'里面的'.'是相对于第一个[0]的
⑨ jq的内建函数
1)判断
1、'has'是用来是判断'是否存在'某个key-->'true'、'false'
jq 'has("sign")'
2)筛选
jq 'select(.age > 24) | {name}' wzj.json
{
"name": "shuifeng"
}
3)计算 1
echo '{"a": 1 , "b": 2}'|jq '.a+100'
101
4)删除json键
jq也支持从JSON对象中删除键,'删除后输出'就'不包含'删除key的JSON对象。删除键使用del()函数,还是以wzj.json为例:
jq 'del(.owner)' wzj.json
结果中就不包括owner键了
5)计算2
jq可以映射值并在'每个值上'执行操作
备注: 数组中的'每个键'进行映射并做数值计算'加2'
echo '[1,2,3,4,5,6]' |jq 'map(.+2)'
[
3,
4,
5,
6,
7,
8
]
⑩ 小结
1) 必须要在'命令行'下处理 JSON,强烈'推荐 jq'
2) jq '不仅'可以满足一般性的常见需求,更包括运算、内置函数、条件比較、 变量声明、自定函数等'强大'功能