YAML第一章 基本概念及语法
简介
本文对YAML的基本概念及语法进行了详细的分析,尤其是对YAML的语法进行了详细的阐述,旨在希望通过本文能对YAML有一个基本的了解,能够书写YAML文档。
声明
本文中的内容属于个人总结整理而来,个人水平有限,对于部分细节难免有理解错误及遗漏之处,如果您在阅读过程中有所发现,希望您能指正,同时文章中的部分内容也参考了其它大神的文章,如果文章中的内容侵犯了您的权益,表示非常歉意,请您指出,我将尽快修改。
如果您进行转载,请标明出处。
YAML学习笔记一 YAML基本概念及语法(http://www.liyubin.com/articles/2019/03/14/1552529532355.html)
YAML基本概念
1. YAML简介
YAML,是一个可读性高,用来表达资料序列的编程语言。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式。目YAML是”YAML Ain’t a Markup Language”(YAML不是一种置标语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种置标语言),但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。
YAML官方文档中给的定义很简单,即:“YAML Ain’t Markup Language” (abbreviated YAML) is a data serialization language designed to be human-friendly and work well with modern programming languages for common everyday tasks. This specification is both an introduction to the YAML language and the concepts supporting it; it is also a complete reference of the information needed to develop applications for processing YAML.
2. YAML VS XML,YAML VS Json,...
网上有很多关于这类的文章的描述,不过多介绍,有兴趣的可以自行搜索比较,看看各路大神对YAML的分析
3. YAML不足
YAML没有自己的数据类型的定义,而是使用实现语言的数据类型。一个YAML文件,在不同语言中解析后得到的数据类型可能会不同,由于其兼容性问题,不同语言间的数据流转不建议使用YAML。
YAML基本语法
1. YAML语法
-
基本格式要求
- YAML使用可打印的Unicode编码作为标准字符编码,可以使用UTF-8或者UTF-16
- YAML对于大小写是敏感的
- YAML文件使用.yaml做为后缀
- YAML使用缩进代表层级关系,同时缩进只能使用空格,不能使用tab键(推荐:在各种语言中为了使用代码统一,可以在各编辑器中设置使用空格来替换Tab,一般使用4个空格),对于空格的数量没有特别的要求,但相同的层级在左对齐
-
基本类型
-
内置类型
类型 表示方法 备注 整数 !!int 可使用10进制,2进制,8进制,16进制表示 浮点数 !!float --- 布尔 !!bool 可以是True,true,tRue,False等,忽略大小写 字符串 !!str 复杂的情况下可以文本块 二进制 !!binary 也是字符串类型 日期时间 !!timestamp 采用ISO8601格式 空值 !! --- 集合 !!set --- 序列 !!seq ---- 键值表 !!map 键是唯一的 键值列表 !!omap --- 对象列表 !!pairs --- 特别指出:对于二进制类型来说本质是上一个base64的文本块,如:
picture: !!binary | R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs=
-
常量值
表示单个的,不可再分的值,主要的结构有:整数,浮点数,字符串,NULL,日期,布尔,时间
布尔型类型:
值为true/false,完全忽略大小写 isstudent: trUe
浮点数:
固定小数: pi: 3.1415926 科学计数法表示: pi: 31415926e-8 负无穷: minmin: -.inf 无效数字: notnum: .NaN
整型值:可以使用10进制、2进制、8进制、16进制表示
10进制: intvalue: 123 2进制: intvalue: 0b1010_1010 8进制: intvalue: 0o34 16进制: intvalue: 0xFFFF
字符串/文本块:
strvalue: newline 字符串类的值,也可以使用单引号或双引号,若字符串中包含有空格或者特殊字符,则必须使用单引号或者双引号,双引号与单引号还有不同,双引号不会对特殊字符转义,若单引号之中还有单引号,则必须连续使用两个单引号转义 字符串可以拆成多行,每一行会被转成一个空格,对于多行字符串可以使用|保留换行符,也可以使用>折叠换行,使用+表示保留文字块末尾的换行,使用-表示删除字符串末尾的换行 字符串也可以HTML标记 strvalue: 'new\nline' 使用单引号相当于{ strvalue: 'new\\nline' } strvalue: "new\nline" 使用双引号相当于{ strvalue: 'new\nline' },双引号不会对特殊字符转义 strvalue: new line 字符串可以拆成多行,每一行会被转成一个空格,相当于{ strvalue: 'new line' } strvalue: | new line 使用|来表示需要保留换行符,相当于{ strvalue: 'new\nline\n' } strvalue: > new line 使用>折叠换行,相当于{ strvalue: 'new line\n' } strvalue: |+ new line 使用+表示保留末尾的换行,相当于{ strvalue: 'new\nline\n' } strvalue: |- new line 使用-表示删除末尾的换行,相当于{ strvalue: 'new\nline' } strvalue: | <p style="color: red"> newline </p> 相当于{ strvalue: '<p style="color: red">\n newline\n</p>\n' }
日期类型:
日期必须使用ISO 8601格式,即:yyyy-MM-dd date: 2019-03-13
时间类型:
时间使用ISO 8601格式,时间和日期之间使用T连接,使用+或者-代表时区 datetime: 2019-03-13T20:49:33+08:00
NULL类型:
使用~表示null nullvalue: ~ 相当于{ nullvalue: null }
-
键值表、映射、哈希、字典
键值对的集合,使用冒号(: )代表,格式为key: value,需要注意的是冒号后面需要添加一个空格,如:
Block style: !!map Clark : Evans Brian : Ingerson Oren : Ben-Kiki Flow style: !!map { Clark: Evans, Brian: Ingerson, Oren: Ben-Kiki } 相当于 { 'Block style': { Clark: 'Evans', Brian: 'Ingerson', Oren: 'Ben-Kiki' },'Flow style': { Clark: 'Evans', Brian: 'Ingerson', Oren: 'Ben-Kiki' } }
当键是一个列表或者键值表时,需要使用问号(? )表示复杂的键,如:
? - blue - red - green : Color 也可以使用流式表示 ? [blue, reg, green]: Color 相当于: { 'blue,red,green': 'Color' }
-
数组、序列、列表
一组按次序排列的值,使用短横线(- )代表数组,格式为- value,需要注意的短横线后面需要添加一个空格,如:
student: - jone - steven - bob
数组可以使用复杂的类型,比如:
classes: - id: 1001 name: jone age: 12 - id: 1002 name: steven age: 14 - id: 1003 name: bob age: 15
数组中复杂的类型,也可以使用流式(flow)方式表示,如:
classes: [{id: 1001, name: jone, age: 12},{id: 1002, name: steven, age: 14},{id: 1003, name: bob,age: 15}]
-
-
注释
YAML中使得#做为注释,从这个字符一直到行尾,都会被忽略
-
文档开始与结束符
使用三个短横线(---),表示一个文档的开始,一般情况下在同一个文件中有有多个时使用
使用三个点号(...),表示一个文档的结束,一般情况下和---共同使用。尤其是对于网络传输或者流来说,作为明确的结束符号有利于软件的处理。比如:
id: 1001
name: jone
age: 12
...id: 1002
name: steven
age: 14
... -
类型强制转换
可以使用双感叹号(!!),表示需要进行类型转换,如:
使用!!str将整型及bool型强制转成字符串 string: - !!str 123456 - !!str true
具体的内置类型可以参看上述的类型描述中
-
引用
可以使用&符号来定义描点,可以使用*来引用定义的描点,可以使用<<来合并到当前数据中,如:
defaults: &defaults adapter: postgres host: localhost development: database: myapp_development <<: *defaults test: database: myapp_test <<: *defaults 相当于 defaults: adapter: postgres host: localhost development: database: myapp_development adapter: postgres host: localhost test: database: myapp_test adapter: postgres host: localhost
-
指令符号
在单一的文档中可以使用指导指令,一般情况下定义在文档的开始早于开始符号(---),使用百分比符号(%),在YAML1.1中定义了两个指导指令:
- %YAML 指导指令,用来识别文件的YAML版本号,放在文档的首行
- %TAG 指导指令,被用在URI的字首标记,这个方法在标记节点的型态时相当有用
TODO:有待进一步补充
-
自定义类型或标识
可以使用单个感叹号(!)表示自定义类型
TODO:有待进一步补充
2. YAML各种语言的实现
YAML语言已经有了多种语言的实现,具体的参见YAML官网,此处将会重点介绍一下C#中YAML的实现。