Yaml (YAML Ain’t Markup Language)
“ YAML是一种数据序列化语言,旨在对人类友好的使用性与现代编程语言很好地配合在程序中使用。
开放,可易于操作且理解的语法极大地提高了程序的处理能力。YAML从一开始就被设计为易于数据使用人员使用。它使用Unicode可打印字符中一些提供结构信息,包含数据本身。YAML通过最小化结构特征的特性并允许数据以其自然而有意义的方式来显示自身,从而实现了独特的清晰度。例如,压痕可用于结构, 冒号分开键:值对和破折号用于创建“项目符号”清单。
有各种各样的独特的数据结构,但它们都可以用三个基本数据类型表示: 映射(哈希/词典), 序列(数组/列表)和 标量(字符串/数字)。YAML利用了这些类型,并添加了一个简单的输入系统和别名机制形成完整的语言序列化数据结构。尽管大多数编程语言都可以使用YAML进行数据序列化,但是YAML擅长使用这些围绕三个基本类型构建的语言。这些包括新的敏捷语言,例如Perl,Python,PHP,Ruby和Javascript。
有数百种用于编程的不同语言,但是只有少数几种用于存储和传输数据的语言。尽管其潜力实际上是无限的,但YAML现在还是专门为在常见的用例(如配置文件,日志文件,进程间消息传递,跨语言数据共享,对象持久性以及复杂数据结构的调试)下正常工作而创建的数据文件。当数据易于查看和理解时,编程将变得更加简单。
YAML的设计目标
基本语法
大小写敏感使用缩进表示层级关系缩进不允许使用tab,只允许空格缩进的空格数不重要,只要相同层级的元素左对齐即可’#'表示注释
YAML 文档分割符
YAML 文件可以由一或多个文档组成(也即相对独立的组织结构组成),文档间使用“—”(三个横线)在每文档开始作为分隔符。同时,文档也可以使用“…”(三个点号)作为结束符(可选), 开头的标识符可以包含yaml解析器的指令,如版本号
#分别表示2块内容
---%YAML: 1.0
#doc1
- foo: 1
bar: 2
---
#doc2
more: stuff
...
数据类型
序列(Array, List)按次序排列的值,可以嵌套使用,不同的子序列可以有不同的长度大小和类型
app:
list:
- l1
- l2
-
- sub1
- sub2
- l4
对象(Map, Object,Dictionary):键值对的集合,又称为映射,字典, 对象可以用复杂key来表示,
map:
key1: val1
key2: val2
key3:
-
skey1: sval1
skey2: sval2
key4:
-
- val1
- val2
#较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value:
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
#意思即对象的属性是一个数组 [complexkey1,complexkey2],对应的值也是一个数组 [complexvalue1,complexvalue2]
纯量(scalars)单个的不可以再分的值,纯量分为字符串,布尔值,整数,浮点数,Null, 时间,日期
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 1231313
- 0b1011_0011_0100_1011_1100 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- line1
line2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
字符串(String)
dateStr:!str 2001-08-01
intStr:!str 192
specialStr: '#:!/%.)'
quoteStr: 'it''s very hard to explain' #it's very hard to explain
linebreak:\“一个在这里\ n,另一个在这里\ n\”
multi-line: "so i'm going to
let it go on and on to other lines
until i end it with a quote."
multi-lineUnquoted : so i'm going to
let it go on and on to other lines
until i end it with a quote.
空值(Null)
可以使用~代表空值
nullKey: ~
‘|’保留换行符
#{ ‘this’ => “Foo\nBar\n” }
this: |
Foo
Bar
“ +”指示符表示将换行符保留到文本块的末尾。
#{preserving: "extra new lines are kept\n\n\n",dummy: "value"},
preserving: |+
extra new lines are kept
dummy: value
为了使您能够更好地控制文本块中保留空间的方式,YAML具有’+‘和’-'指示符。‘+’指示器将保留所有结尾的换行符,而‘-’指示器将去除所有结尾的换行符。
Yaml
#保留末尾一个换行符
clipped: |
This has one newline.
same as "clipped" above: "This has one newline.\n"
#‘-’不保留末尾的换行符
stripped: |-
This has no newline.
#没有换行符
same as "stripped" above: "This has no newline."
#保留4个换行符直到same as
kept: |+
This has four newlines.
same as "kept" above: "This has four newlines.\n\n\n\n"
Yaml输出如下:
{
'clipped' => "This has one newline.\n",
'same as "clipped" above' => "This has one newline.\n",
'stripped' => 'This has no newline.',
'same as "stripped" above' => 'This has no newline.',
'kept' => "This has four newlines.\n\n\n\n",
'same as "kept" above' => "This has four newlines.\n\n\n\n"
}
‘>’字符,后跟缩进的文本块被视为折叠块即一块内容,其中由单个换行符分隔的文本行被连接为单个行。
Yaml
quote: > Mark McGwire's
year was crippled
by a knee injury.
source: espn
#显示如下
{‘quote’ : "Mark McGwire's year was crippled by a knee injury.\n",
'source' : 'espn'
}
&别名和*锚点,即变量和引用变量方式,yaml用 ‘&’来定义一个变量,用 ‘*’来引用这个变量
- &val; Steve
- Clark
- Brian
- Oren
- *val
#显示内容
[ 'Steve ', 'Clark', 'Brian', 'Oren', 'Steve' ]
对象引用和别名
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: test
<<: *defaults
#<<将追加default内容到test节点相当于:
database: test
adapter: postgres
host: localhost
指标字符
序号 | 性格与功能 |
---|---|
1 | _ 它表示块序列条目 |
2 | ? 它表示映射键 |
3 | : 它表示映射值 |
4 | , 它表示流量收集条目 |
5 | [ 它启动流程序列 |
6 | ] 它结束了流程序列 |
7 | { 它启动流程映射 |
8 | } 它结束了流程映射 |
9 | # 它表示评论 |
10 | & 它表示节点的锚属性 |
11 | * 它表示别名节点 |
12 | ! 它表示节点的标签 |
13 | | 它表示一个字面块标量 |
14 | > 它表示折叠块标量 |
15 | ` 单引号围绕引用的流标量 |
16 | “ 双引号包围双引号流量标量 |
17 | % 它表示使用的指令 |