YAML 要点速记

148 阅读3分钟

YAML 要点速记

一、前言

笔者最近一直在用docker compose 部署一些开源项目,配置文件用的是yml的语法;前两天接触到CNB.cool(云原生构建),其配置文件也用yml的语法,所以稍微学习下yml的语法,总结如下。

二、文章大纲

本文大纲如下:

三、概念

YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。

YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

以上描述来自于百度百科YAML[1]。

四、核心

  • • 以数据为中心
  • • 以空格、换行组织数据
  • • 包含三种数据结构:数组、对象、纯量

五、语法要点

  1. 大小写敏感;
  2. 使用缩进表示层级关系,缩进不允许使用tab,只能使用空格;
  3. 空格数量不重要,只要相同层级的元素,缩进相同即可(即左端对齐);
  4. 使用#表示注释
  5. 冒号:后跟一个空格,才能跟属性值;
  6. 字符串可以不用引号。

六、数据结构示例

对象

  • 对象键值使用冒号结构表示 key: value 冒号后面要加一个空格
  • 还可以使用缩进表示层级关系。
# 简单对象
id: 1
# 嵌套对象
version: 
  major: 1
  patch: 0
# 也可以使用行内表示法,类似json语法,注意冒号后面要加一个空格
name: {first: Jonlast: Snow}

转换成json如下:

{
  "id": 1,
  "version": {
    "major": 1,
    "patch": 0
  },
  "name": {
    "first": "Jon",
    "last": "Snow"
  }
}

较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value:

? 
  - key1
  - key2
: 
  - val1
  - val2

数组

以 - 开头的行表示构成一个数组:

# 简单数组
- item1
- item2
- item3
# 嵌套数组
-
  - item1
  - item2
  - item3
-
 - item4
 - item5
 - item6
# 数组嵌套对象
peoples:
 -
  name: Jon
  age: 18
 -
  name: Snow
  age: 20
# 也可以用行内表示,类似json语法,
array: [item1item2item3]

转化成json如下:

 {
  "peoples": [
    {
      "name": "Jon",
      "age": 18
    },
    {
      "name": "Snow",
      "age": 20
    }
  ],
  "array": [
    "item1",
    "item2",
    "item3"
  ]
}

纯量

纯量包括字符串、布尔值、整数、浮点数、null、日期、时间。

string:
 - "hello world" # 字符串如包含特殊符号可以使用引号括起来
 - 你好,世界
 - line1
   line2
boolean: 
 - true
 - False # 布尔值大小写这几种写法都可以
 - TRUE
int: 
 - 1
 - 0b10 # 二进制
float:
 - 1.0
 - 1.123456e+3 # 科学计数法
null:
 node: ~ #使用~表示null
date: 2020-01-01 #日期必须使用ISO 8601格式,即yyyy-MM-dd
time: 2020-01-01T12:00:00+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

引用

&可以标记一个锚点,然后通过*引用锚点;<< 可以将锚点中的内容合并到当前对象中。

defaults: &defaults
 name: l
 id: 1
env: 
 <<: *defaults
 port: 8080
pro:
 - &i1 1
 - 2
 - *i1

生成的json如下:

{
  "defaults" : {
    "name" : "l",
    "id" : 1
  },
  "env" : {
    "name" : "l",
    "id" : 1,
    "port" : 8080
  },
  "pro" : [ 1, 2, 1 ]
}
引用链接

[1] YAML: baike.baidu.com/item/YAML/1…