YAML 格式的文件在 Jekyll 的时候接触到,Jekyll 的配置文件就是 YAML。Jekyll 本身由 Ruby 写成,而 Ruby 本身和 YAML 有着方方面面的联系,Ruby 的配置文件约定是 YAML。同时,YAML 还是 Ruby 的文本序列化格式。
YAML 是一个可读性高,用来表达资料序列的文件格式。YAML 是”YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的缩写1 。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重新命名。
空格缩进和 JSON 选项
YAML 文件格式主要集中于空格与缩进的概念,它用于指出数据的层次结构 – 而不是使用 XML 嵌套标记或 JSON 的大括号({})和方括号([]),实际上,它是 JSON 的一个超集,因此,在使用的时候,你可能需要采用 JSON 风格的语法来跳出空格流,它的创始人将其形容为“为所有编程语言提供人性化的数据序列化标准2”,其重点是人性化。
世上有很多的数据结构,但是都可以归结到三种最基本的结构(primitives):mappings (hashes/dictionaries), sequences (arrays/lists) and scalars (strings/numbers). 有了这三种基本结构,绝大部分的编程语言都能够使用 YAML 了。
YAML 可以被用来作为:configuration files (配置文件), log files(日志文件),interprocess messaging(进程间通信),cross-language data sharing(跨语言数据交换),object persistence(对象持久化)和 debugging of complex data structures(复杂数据结构的调试)。当数据能够容易的被读懂的时候,任何事情都会变得简单。
YAML 的目标
The design goals for YAML are3, in decreasing priority:
- YAML is easily readable by humans.
- YAML data is portable between programming languages.
- YAML matches the native data structures of agile languages.
- YAML has a consistent model to support generic tools.
- YAML supports one-pass processing.
- YAML is expressive and extensible.
- YAML is easy to implement and use.
YAML 结构组件
YAML 的结构:hash,list 和 block literal
YAML 举例,一般扩展名为.yaml
,也可以为.yml
,比如:John.yml
name: John Smith
age: 37
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name: Jenny Smith
age 12
语义介绍:John 今年 37 岁,有一个幸福的四口之家。两个孩子 Jimmy 和 Jenny 活泼可爱。妻子 Jane 年轻美貌。
值得注意的是字符串不一定需要双引号,当然如果强行添加双引号也可以。比如 "name: "John Smith"
同样也是可以的。
sequence
也可以叫做 list/array ,数组,列表,清单等等
使用-
表示 list
- Mark McGwire
- Sammy Sosa
- Ken Griffey
同样可以使用中括号来在行内表示:inline format, using [] ,
[Mark McGwire, Sammy Sosa, Ken Griffey]
二维数组,或者数组中包含数组可以写成
- [name , hr, avg ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa , 63, 0.288]
map
或者叫做 hash/dictionary ,键值对,散列,哈希,字典等等。使用:
表示,以:
分割 key:value
hr: 65 # Home runs
avg: 0.278 # Batting average
rbi: 147 # Runs Batted In
使用大括号来在行内表示 inline format, using {} ,
{hr: 65, avg: 0.278, rbi: 147}
hash 中包含 hash 可以写成这样:
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
hr: 63,
avg: 0.288
}
散列的 key 值可以不为字符串,比如
0.25: a float key
key 的值也可以多行,使用 ? 表示 key 的开始:
? |
This is a key
that has multiple lines
: and this is its value
list 和 hash 相互包含
hash 内包含数组:
american:
- Boston Red Sox
- Detroit Tigers
- New York Yankees
national:
- New York Mets
- Chicago Cubs
- Atlanta Braves
数组内包含 hash:
- # one hr
name: Mark McGwire
hr: 65
avg: 0.278
-
name: Sammy Sosa
hr: 63
avg: 0.288
block literal(文字块)
使用|
表示文字块,YAML 中字符串不需要包含在引号之内。
literal_block: |
This entire block of text will be the value of the 'literal_block' key, with line breaks being preserved.
The literal continues until de-dented, and the leading indentation is stripped.
another_block: >
This is another block of text
YAML VS XML & JSON
正如你从前面例子中清楚地看到那样,YAML 没有 XML 那么啰嗦了,大部分 YAML 文件内容就是真实的数据,没有了无穷尽的打开和关闭标记列表,在 XML 中,这些标记往往比它们描述的数据还大,YAML 更适合你需要手工维护的数据文件类型。
YAML 没有提供方案或 DTD 概念,因此无法验证文件格式是否符合你的预期,XML 的啰嗦也有它的价值,但总的说来是因为 XML 的成熟使它具有大量额外的工具来验证它的格式,而 YAML 还没有。
JSON 也适合与任何数据,它主要面向提高性能和文件尺寸的大小,因为它几乎不使用空格和关闭标签,然而,JSON 文件的内容增加了复杂性,它的关闭标识就象下地狱一样,这就是 JavaFx 代码(它基于 JSON)中可见的最痛苦的了,在数据文件中,使用 UI 结构使结果更复杂,其复杂程度几乎使文件变得无法理解。
掺和了{}结构和[]清单,使得手工维护大型的 JSON 风格的文件变得相当困难,YAML 使用它的空格缩进方法巧妙地解决了这个问题,当然,无论何时,你都可以切换到 JSON 风格的语法(如在底层节点)。
YAML Validation
作为一种格式,必然是人为规定,也必然存在格式检查工具,下面就是俩:
- YAML lint http://www.yamllint.com/
- YAML online Parser http://yaml-online-parser.appspot.com/