[TOC]
0x00 前言 YAML是"YAML Ain't a Markup Language"
的缩写,它是一种可读性高,用来表达数据序列化语言,你仍然可以理解是是一种标记语言,但是为了强调这种语言以数据未中心,而不是以标记语言为重点; YAML(带有”骆驼”的韵律)是一种基于 Unicode 的基于 Unicode 的数据序列化语言,它围绕敏捷编程语言的常见本机数据类型而设计,它使用 Unicode可打印字符,其中一些字符提供结构信息,其余字符包含数据本身;但是如果你使用过类似XML/JSON这种标记语言(利于人们读写的数据格式
),那么你可能会很快的学会YAML,与XML相同的是我们可以使用YAML编写配置文件;
YAML 通过最小化结构字符的数量并允许数据以自然和有意义的方式显示自身, 它对于编程需求(从配置文件到 Internet 消息传递、对象持久性到数据审核)都非常有用。
YAML格式的文件拓展名包括:.yml 和 .yaml
,两个都表示YAML文件;
三个基本基元(数据结构)来充分表示:
对象:键值对的集合,又称为映射建(mapping) / 哈希9Hash) / 字典 (Dictionary)
数组:一组安装次序排列的值,又称为序列(sequence) / 列表(List)
存量: 单个的不可再分得值也叫标量,例如字符串 String / 数字 scalars
目前经过三个版本:
YAML优缺点:
YAML 很容易被人类阅读。
YAML 数据可移植到编程语言之间。
YAML 与敏捷语言的本机数据结构相匹配。
YAML 具有一致的模型来支持通用工具。
YAML 支持单通道处理。
YAML 具有表现力和可扩展性。
YAML 易于实现和使用(独特的清洁)。
应用场景:
ansible清单也支持YAML的语法,可以使用YAML语法编写清单从而管理受管主机;
docker-compose的DockerFile的文件内容中使用它;
kubernetes 资源清单
如Perl、Python、PHP、Ruby和Javascript都有对应的解析库
Renfencer
0x01 语法格式 每一个 YAML 文件都是从一个列表开始. 列表中的每一项都是一个键值对, 通常它们被称为一个 “哈希” 或 “字典”. 所以我们需要知道如何在 YAML 中编写列表和字典. YAML注释:使用#作为注释
,并且YAML中只有行注释。
基本格式要求:
1,YAML大小写敏感;
2,使用缩进代表层级关系;
3,缩进只能使用空格不能使用TAB
,不要求空格个数,只需要相同层级左对齐(一般2个或4个空格)
4, 标识注释符 # 从该字符到行尾都将被解释器忽略;
常量 YAML中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间,还允许表示三种格式分别是常量值,对象和数组
[TOC]
0x00 前言 YAML是"YAML Ain't a Markup Language"
的缩写,它是一种可读性高,用来表达数据序列化语言,你仍然可以理解是是一种标记语言,但是为了强调这种语言以数据未中心,而不是以标记语言为重点; YAML(带有”骆驼”的韵律)是一种基于 Unicode 的基于 Unicode 的数据序列化语言,它围绕敏捷编程语言的常见本机数据类型而设计,它使用 Unicode可打印字符,其中一些字符提供结构信息,其余字符包含数据本身;但是如果你使用过类似XML/JSON这种标记语言(利于人们读写的数据格式
),那么你可能会很快的学会YAML,与XML相同的是我们可以使用YAML编写配置文件;
YAML 通过最小化结构字符的数量并允许数据以自然和有意义的方式显示自身, 它对于编程需求(从配置文件到 Internet 消息传递、对象持久性到数据审核)都非常有用。
YAML格式的文件拓展名包括:.yml 和 .yaml
,两个都表示YAML文件;
三个基本基元(数据结构)来充分表示:
对象:键值对的集合,又称为映射建(mapping) / 哈希9Hash) / 字典 (Dictionary)
数组:一组安装次序排列的值,又称为序列(sequence) / 列表(List)
存量: 单个的不可再分得值也叫标量,例如字符串 String / 数字 scalars
目前经过三个版本:
YAML优缺点:
YAML 很容易被人类阅读。
YAML 数据可移植到编程语言之间。
YAML 与敏捷语言的本机数据结构相匹配。
YAML 具有一致的模型来支持通用工具。
YAML 支持单通道处理。
YAML 具有表现力和可扩展性。
YAML 易于实现和使用(独特的清洁)。
应用场景:
ansible清单也支持YAML的语法,可以使用YAML语法编写清单从而管理受管主机;
docker-compose的DockerFile的文件内容中使用它;
kubernetes 资源清单
如Perl、Python、PHP、Ruby和Javascript都有对应的解析库
Renfencer
0x01 语法格式 每一个 YAML 文件都是从一个列表开始. 列表中的每一项都是一个键值对, 通常它们被称为一个 “哈希” 或 “字典”. 所以我们需要知道如何在 YAML 中编写列表和字典. YAML注释:使用#作为注释
,并且YAML中只有行注释。
基本格式要求:
1,YAML大小写敏感;
2,使用缩进代表层级关系;
3,缩进只能使用空格不能使用TAB
,不要求空格个数,只需要相同层级左对齐(一般2个或4个空格)
4, 标识注释符 # 从该字符到行尾都将被解释器忽略;
常量 YAML中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间,还允许表示三种格式分别是常量值,对象和数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 url: http://www.wolfcode.cn server: host: http://www.wolfcode.cn server: - 120.168.117.21 - 120.168.117.22 - 120.168.117.23 e: !!str 123 f: !!str true pi: 3.14 hasChild: true boolean: - TRUE - FALSE float : - 3.14 - 6.8523015e+5 int: - 123 - 0b1010_0111_0100_1010_1110 null: nodeName: 'node' parent: ~ name: '你好YAML' string: - 哈哈 - 'Hello world' - newline newline2 date: - 2018-02-17 datetime: - 2018-02-17T15:02:31+08:00
注意:在定义字符串类型的时里面的字符串你需要使用引号来包裹;
对象 描述:使用冒号代表,格式为key: value
,冒号后面要加一个空格;可以使用缩进表示层级关系;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 key: child-key: value child-key2: value2 key: {child-key: value, child-key2: value2} ? - Key1 - Key2 : - Value1 - Value2
意思:即对象的属性是一个数组[key1,key2]
,对应的值也是一个数组[value1,value2]
;
数组 描述:使用一个短横线加一个空格代表一个数组项:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 array: - Java - C++ - C - - Java - LOL companies: [ {id: 1,name: company1,price: 200W}, {id: 2,name: company2,price: 500W} ]
示例:1 2 3 4 5 6 7 8 9 10 companies: - id: 1 name: company1 price: 200W - id: 2 name: company2 price: 500W
特殊符号 YAML中提供了很多特殊符号,比如 ---(文档开始)
, ...(文档结束)
, !!(强制转换)
, > (不换行) 与 | (换行)
, & (锚点) 与 * (引用)
, << (合并)
, ~ (代表NULL)
, '(转义'符号)
, +/-(表示保留与删除换行)
--- YAML
可以在同一个文件中,使用—表示一个文档的开始
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 server: address: 192.168 .1 .100 --- spring: profiles: development server: address: 127.0 .0 .1 --- spring: profiles: production server: address: 192.168 .1 .120 --- Time: 2018 -02 -17 T15:02:31+08:00 User: ed Warning: This is an error message for the log file --- Time: 2018 -02 -17 T15:05:21+08:00 User: ed Warning: A slightly different error message.
... 和---配合使用
,在一个配置文件中代表一个文件的结束
:1 2 3 4 5 6 7 8 9 10 11 --- time: 20:03:20 player: Sammy Sosa action: strike (miss) ... --- time: 20:03:47 player: Sammy Sosa action: grand slam ...
!! YAML中使用!!做类型强行转换
1 2 3 4 5 6 7 8 9 10 11 string: - !!str 54321 - !!str true --- !!set - Mark McGwire: 65 - Sammy Sosa: 63 - Sammy Sosa: 63 - Ken Griffy: 58
将数组解析为set,简单理解转化的内容就是:[{Ken Griffy=58}, {Mark McGwire=65}, {Sammy Sosa=63}],重复的Sammy Sosa去掉;
>在字符串中折叠换行(变成单行)
, |保留换行符
这两个符号是YAML中字符串经常使用的符号,比如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 accomplishment: > Mark set a major league home run record in 1998. stats: | 65 Home Runs 0.278 Batting Average phraseTemplate: | <p style="color: red" > some template ${msg} </p>
即将换行符转化成了空格;要注意一点的是,每行的文本前一定要有一个空格
。
引用重复的内容在YAML中可以使用&来完成锚点定义,使用*来完成锚点引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 hr: - Mark McGwire - &SS Sammy Sosa rbi: - *SS - Ken Griffey {rbi=[Sammy Sosa, Ken Griffey], hr=[Mark McGwire, Sammy Sosa]} SS: &SS Sammy Sosa hr: - Mark McGwire - *SS rbi: - *SS - Ken Griffey default: &default - Mark McGwire - Sammy Sosa hr: *default
合并内容 <<
。主要和锚点配合使用,可以将一个锚点内容直接合并到一个对象中。 来看一个示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 merge: - &CENTER { x: 1 , y: 2 } - &LEFT { x: 0 , y: 2 } - &BIG { r: 10 } - &SMALL { r: 1 } sample1: <<: *CENTER r: 10 sample2: << : [ *CENTER, *BIG ] other: haha sample3: << : [ *CENTER, *BIG ] r: 100
有了合并,我们就可以在配置中,把相同的基础配置抽取出来,在不同的子配置中合并引用即可。
特殊符号与转义'
符号妙用
1 2 3 4 5 6 str: '内容: 字符串' s1: '内容\n字符串' s2:"内容\n字符串"
使用+ 保留文件块末尾换行, - 表示删除字符串末尾的换行
1 2 3 4 5 6 7 8 s1: | Foo s2: |+ Foo s3: |- Foo
0x02 补充示例 编码存放 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 --- demo: - unicode: "Sosa did fine.\u263A" - control: "\b1998\t1999\t2000\n" - hex esc: "\x0d\x0a is \r\n" - single: '"Howdy!" he cried.' - quoted: ' # Not a ' 'comment' '.' - tie-fighter: '|\-*-/|' { demo: [ { unicode: 'Sosa did fine.☺' }, { control: '\b1998\t1999\t2000\n' }, { 'hex esc' : '\r\n is \r\n' }, { single: '"Howdy!" he cried.' }, { quoted: ' # Not a \'comment\'.' }, { 'tie-fighter' : '|\\-*-/|' } ] }
时间时区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 timestamp: canonical: 2001-12-15T02:59:43.1Z valid iso8601: 2001-12-14t21:59:43.10-05:00 space separated: 2001-12-14 21:59:43.10 -5 no time zone (Z): 2001-12-15 2:59:43.10 date (00:00:00Z): 2002-12-14 timestamp: { canonical: Sat Dec 15 2001 10:59:43 GMT+0800 (中国标准时间), 'valid iso8601' : Sat Dec 15 2001 10:59:43 GMT+0800 (中国标准时间), 'space separated' : Sat Dec 15 2001 10:59:43 GMT+0800 (中国标准时间), 'no time zone (Z)' : Sat Dec 15 2001 10:59:43 GMT+0800 (中国标准时间), 'date (00:00:00Z)' : Sat Dec 14 2002 08:00:00 GMT+0800 (中国标准时间) },
yaml正则 1 2 3 4 5 6 7 8 9 10 11 12 13 14 regexp: simple: !!js/regexp foobar modifiers: !!js/regexp /foobar/mi undefined: !!js/undefined ~ function : !!js/function > function foobar () { return 'Wow! JS-YAML Rocks!' ; }