YAML 入门指南

作者: Kassadar | 来源:发表于2019-07-01 09:25 被阅读0次

YAML 入门指南

YAML 简介

我们使用 YAML 是因为它像 XML 或 JSON 是一种利于人们读写的数据格式。YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。

格式注意

  • 使用缩进表示层级关系
  • 缩进不允许使用 tab ,只能使用空格
  • 空格的个数不重要,但是相同层级的元素需要左对齐
  • 冒号后如果有值,格式为key: value。冒号后要有一个空格
  • 不要使用 “=” 号
  • 大小写敏感
  • “#” 作为注释,并且只有行注释
  • 使用 “---” 表示一个文档的开始

YAML 的数据结构

简单的说 YAML 支持的数据结构有三种。

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 常量(scalars):单个的、不可再分的值

下面简单描述下

对象

对象的一组键值对,使用冒号结构表示。
使用冒号代表,格式为key: value。冒号后面要加一个空格:

key: value

转为 JavaScript 如下。

{ key: 'value' }

可以使用缩进表示层级关系;

key: 
    child-key: value
    child-key2: value2

也允许另一种写法,将所有键值对写成一个行内对象。

key: { child-key: value, child-key2: value2 }

转为 JavaScript 如下。

{ key: { child-key: 'value', child-key2: 'value2' } }

数组

使用一个短横线加一个空格代表一个数组项。

fruit:
  - Apple
  - Orange
  - Strawberry
  - Mango

转为 JavaScript 如下。

{ fruit: [ 'Apple', 'Orange', 'Strawberry' ,'Mango' ] }

当然也可以有这样的写法。

-
  - Apple
  - Orange
  - Strawberry
  - Mango

转为 JavaScript 如下。

{ [ [ 'Apple', 'Orange', 'Strawberry' ,'Mango' ] ] }

数组也可以采用行内表示法。

fruit: [ Apple, Orange, Strawberry, Mango ]

转为 JavaScript 如下。

{ fruit: [ 'Apple', 'Orange', 'Strawberry' ,'Mango' ] }

一个相对复杂的例子:

fruits:
    -
        id: 1
        name: Apple
        price: 10
    -
        id: 2
        name: Orange
        price: 8

意思是 fruits 属性是一个数组,每一个数组元素又是由 id,name,price 三个属性构成。

数组也可以使用流式 (flow) 的方式表示:

fruits: [ { id: 1 ,name: Apple ,price: 10 } ,{ id: 2 ,name: company2 ,price: 8 } ]

常量

YAML中提供了多种常量结构。

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期

数值直接以字面量的形式表示。

number: 12.30
number: 6.8523015e+5  #可以使用科学计数法
number: 0b1010_0111_0100_1010_1110  #二进制表示

布尔值

create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false

null 用 ~ 表示

parent: ~

时间采用 ISO8601 格式。

datetime: 2018-12-14T21:59:43.10-05:00  #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

转为 JavaScript 如下。

{ iso8601: new Date('2018-12-14t21:59:43.10-05:00') }

日期采用复合 iso8601 格式的年、月、日表示。

date: 1976-07-31  #日期必须使用ISO 8601格式,即yyyy-MM-dd

字符串

字符串是最常见,也是最复杂的一种数据类型。

string:
    - 哈哈
    - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2  #字符串可以拆成多行,每一行会被转化成一个空格

一些特殊符号

文档的开始和结束
YAML 可以在同一个文件中,使用 “---” 表示一个文档的开始;比如 Springboot 中 profile 的定义

server:
    address: 192.168.1.100
---
spring:
    profiles: development
    server:
        address: 127.0.0.1
---
spring:
    profiles: production
    server:
        address: 192.168.1.120

“...” 和 “---” 配合使用,在一个配置文件中代表一个文件的结束

---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...

类型转换

YAML 允许使用两个感叹号,强制转换数据类型。

e: !!str 123
f: !!str true

转为 JavaScript 如下。

{ e: '123', f: 'true' }

当然允许转型的类型很多

!!set
- Mark McGwire: 65
- Sammy Sosa: 63
- Sammy Sosa: 63
- Ken Griffy: 58

转为 JavaScript 如下。

{ [ { Ken Griffy=58 }, { Mark McGwire=65 }, { Sammy Sosa=63 } ] }  #将数组解析为集合 ,重复的 Sammy Sosa 会被去掉;

引用
锚点& 和别名*,可以用来引用。

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

&用来建立锚点(defaults),<<表示合并到当前数据,*用来引用锚点。

下面是另一个例子。

- &showell Steve
- Clark
- Brian
- Oren
- *showell

转为 JavaScript 代码如下。

{ [ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ] }

相关文章

网友评论

    本文标题:YAML 入门指南

    本文链接:https://www.haomeiwen.com/subject/mepwcctx.html