YAML语法简明教程

YAML

YAML是一个可读性高,用来表达数据序列的格式。是 “YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。

YAML的语法和其他高级语言类似,可以简单表达清单、散列表,标量等数据形态。由于YAML使用空白字符和分行来分隔数据,使得它特别适合用grep/Python/Perl/Ruby操作。其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构时会变得复杂而难以辨认(字符串中引号需要额外转义)。

设计目标

  • 人类容易阅读
  • 可用于不同程序间的数据交换
  • 适合描述程序所使用的数据结构,特别是脚本语言
  • 丰富的表达能力与可扩展性
  • 易于使用

语法

  • YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16。
  • 使用空白字符为文件缩进来表示结构;不过不能使用制表符符(TAB)。
  • 注解由井字号( # )开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解)
  • 在单一文件中,可用连续三个连字号(—)区分多个文件。
    另外,还有选择性的连续三个点号( … )用来表示文件结尾。

数据结构

YAML 有三种数据结构,其中 数组和键值对有两种表达方式,数据结构可以嵌套形成复杂的复合结构

  • 标量 (基础数据类型)
  • 数组 (也被称为序列、列表)
  • 键值表(也被称为对象、Map表)

标量

类型 yaml json
字符串 str: balabala { str:”balabala” }
布尔值 boolValue: true { boolValue:true }
整数 intValue: 1234 { intValue:1234 }
浮点数 number: 12.30 { number: 12.30 }
null nullValue: ~ { nullValue: null }

因为YAML 字符串不需要包在引号之内 所以当出现 str: 123 就会有歧义,难以区分123是字符串还是数值。这个时候可以用 双引号将123 包裹起来,如:str: “123” 。
此外YAML 还提供了强制类型转换,通过两个! 表示值的类型。
比如:str: !!str 123
再比如:floatValue: !!float 123

数组

数组有两中表达方式:

  1. 使用“-”(横线) + 空格表示单个列表项
1
2
3
4
--- # 文档开始
- 小明
- 小红
- 小芳
  1. 使用 [] 包裹,并用逗号+空格 [, ] 分开成员
1
2
--- # 文档开始
[小明, 小红, 小芳]

键值对

键值对 也有两种表达方式,通过配合数组嵌套能够形成复杂的数据结构

  1. 使用 “:”(冒号) + 空格表示单个键值对

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 用户信息
    user:
    userid: 7654321
    userinfo:
    name: Mike
    age: 28
    userfriend:Â
    - 小明
    - 小红
    - 小芳
  2. 使用 大括号{} 包裹, 并用用逗号+空格分隔 key: value对

1
2
3
4
5
# 用户信息
{ user:
{ userid: 7654321,
userinfo: { name: 'Mike', age: 28 },
userfriend: [ '小明', '小红', '小芳' ] }

特别的。 当键是一个列表或键值表时,可以通过 “? “ 问号+空格表示复杂的键。

字符串

字符串默认不需要加引号。加了单引号和双引号处理特殊字符会有差异。
单引号会转义特殊字符,双引号不会。特别的,如果单引号里面包含单引号 需要额外一个 ‘ 转义
如:

1
2
3
4
test:
str1: '我是’'字符\n串'
str2: "我是'字符\n串"
# json的写法 { test: { str1: '我是\'字符\\n串', str2: '我是\'字符\n串' }

多行字符串可以使用 | 保留换行符 \n ,也可以使用 > 去除换行。 在该符号之后额外添加+ - 可以保留或移除最后的一堆换行

1
2
3
4
5
6
7
8
9
10
11
12
13
data: >
do you know
php is the
best language

json写法 data: 'do you know php is the best language\n'

data: |-
do you know
php is the
best language

json写法 data: 'do you know\nphp is the\nbest language'

锚点

锚点与引用,定义数据的复用。使用 “&” 定义数据锚点(即要复制的数据)使用 * 引用上述锚点数据(即粘贴数据)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
str1: &q which language is best?

print: &chat
quest: *q
answer: php

print2:
chat: Tell me.
<< : *chat

json写法

str1: 'which language is best?',
print: { quest: 'which language is best?', answer: 'php' },
print2:
{ chat: 'Tell me.',
quest: 'which language is best?',
answer: 'php' }

参考链接

https://www.wikiwand.com/zh-cn/YAML
http://www.ruanyifeng.com/blog/2016/07/yaml.html
https://blog.csdn.net/liukuan73/article/details/78031693