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:

  1. YAML is easily readable by humans.
  2. YAML data is portable between programming languages.
  3. YAML matches the native data structures of agile languages.
  4. YAML has a consistent model to support generic tools.
  5. YAML supports one-pass processing.
  6. YAML is expressive and extensible.
  7. 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

作为一种格式,必然是人为规定,也必然存在格式检查工具,下面就是俩: