YAML格式的文件在Jekyll的时候接触到,Jekyll的配置文件就是YAML。Jekyll本身由Ruby写成,而Ruby本身和YAML有着方方面面的联系,Ruby的配置文件约定是YAML。同时,YAML还是Ruby的文本序列化格式。
YAML是一个可读性高,用来表达资料序列的文件格式。YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的缩写 。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重新命名。
空格缩进和JSON选项YAML文件格式主要集中于空格与缩进的概念,它用于指出数据的层次结构 – 而不是使用XML嵌套标记或JSON的大括号({})和方括号([]),实际上,它是JSON的一个超集,因此,在使用的时候,你可能需要采用JSON风格的语法来跳出空格流,它的创始人将其形容为“为所有编程语言提供人性化的数据序列化标准”,其重点是人性化。
世上有很多的数据结构,但是都可以归结到三种最基本的结构(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 are, in decreasing priority:
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 {} ,
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作为一种格式,必然是人为规定,也必然存在格式检查工具,下面就是俩:
Wikipedia
yaml spec 1.2