YAML(Yet Another Markup Language) 是一种适用于所有编程语言的,人性化数据序列化语言,功能类似与 json、xml 等,但更简洁和方便
介绍
- 基本语法
- 缩进表示层级关系,只允许使用空格缩进,空格数量不要求,但需要对齐
- #表示注释
- 大小写敏感
- ---表示内容的开始
- ...表示内容的结束(非必需)
 
- 数据类型
- 对象:键值对,又称:dict、hash、map
- 数组:有序排列的值,又称:sequence、list
- scalars:标量,单独的、不可再分的值
 
- vscode 检测插件 redhat-developer/vscode-yaml
数据类型
对象
格式:key: value,冒号后加一个空格
key1: value1
key2:
  c-key1: c-value1
  c-key2: c-value2
问号 ? 声明一个复杂(key)对象,示例如下:
?
  - keypart1
  - keypart2
:
  - value1
  - value2
# 对应的 json
{
    "keypart1,keypart2": [
        "value1",
        "value2"
    ]
}
属组
以 -  开头的行,示例
key1:
  - v1
  - v2
  - v3
# 或
key1: [v1, v2, v3]
# 对应的 json
{
    "key1": [
        "v1",
        "v2",
        "v3"
    ]
}
结果子成员:
-
 - v1
 - v2
 - v3
# 对应json
[
    [
        "v1",
        "v2",
        "v3"
    ]
]
users:
    -
        id: 1
        name: u1
    -
        id: 2
        name: u2
# 或
users: [{id: 1, name: c1}, {id:2, name: c2}]
# 对应的 json
{
    "users": [
        {
            "id": 1,
            "name": "u1"
        },
        {
            "id": 2,
            "name": "u2"
        }
    ]
}
scalars
标量是最基本的,不可再分的值,如下:
- 字符串
- 布尔值
- 整数
- 浮点数
- 日期
- 时间
- Null
示例:
string:
    - 'Hello world'  # 使用双引号或者单引号包裹特殊字符。使用双引号引用字符串时,会转义字符串中的特殊字符(例如\n);使用单引号时不会转义字符串中的特殊字符
    - newline
      newline2  # 字符串可以被拆成多行,每行使用空格分隔
boolean:
    - true  # true, True
    - yes  # yes, Yes, YES
    - false  # false, False
    - no  # no, No, NO
int:
    - 99
    - 0b1010_0111_0100_1010_1110  # 二进制
float:
    - 3.14
    - 3.1415926e+3  # 科学计数法
date:
    - 2021-10-24  # 日期必须为 ISO 8601 格式,即yyyy-MM-dd
datetime:
    -  2021-10-24T15:02:31+08:00  # 时间必须为 ISO 8601 格式,时间和日期使用 T 连接,+ 后表示时区
null:
    nodeName: null
    parent: ~  # ~ 表示null
# 对应的 json
{
    "string": [
        "Hello world",
        "newline newline2"
    ],
    "boolean": [
        true,
        false
    ],
    "int": [
        99,
        685230
    ],
    "float": [
        3.14,
        3141.5926
    ],
    "date": [
        "2021-10-24T00:00:00.000Z"
    ],
    "datetime": [
        "2021-10-24T07:02:31.000Z"
    ],
    "null": {
        "nodeName": null,
        "parent": null
    }
}
高级使用
保留换行(Newlines Preserved)
竖线符 | 实现
lines: |
  第一行
  第二行
    第三行
      第四行
  第五行
# 对应的 json
{
    "lines": "第一行\n第二行\n  第三行\n    第四行\n第五行\n"
}
- |+保留每行尾部的换行符- \n,同时保留内容结尾处的换行符- \n
- |-保留每行尾部的换行符- \n,同时删除内容结尾处的换行符- \n
去除换行(Newlines Folded)
右尖括号 > 实现,遇到空白行或不对齐时会被识别为换行
lines: >
  第一行
  第二行
    第三行
      第四行
  第五行
# 对应的 json
{
    "lines": "第一行 第二行\n\n  第三行\n    第四行\n第五行\n"
}
Adding - after either | or > will strip the newline character from the last line:
a: >- # folded into "one two"
  one
  two
b: >- # folded into "one\ntwo"
  one
  two
类型转换
使用 !!(双感叹号+目标类型)强制转换类型
a: !!float '666'  # !! 为严格类型标签
b: '666'  # 单、双引号也算是类型转换符
c: !!str 666  # 整数转为字符串
d: !!str 666.66  # 浮点数转为字符串
e: !!str true  # 布尔值转为字符串
f: !!str yes  # 布尔值转为字符串
# 对应的 json
{
    "a": 666,
    "b": "666",
    "c": "666",
    "d": "666.66",
    "e": "true",
    "f": "yes"
}
引用
使用 & 表示锚点,* 表示引用锚点,<< 表示合并到当前数据
defaults: &defaults
  class: 6-1
  teacher: "xianbin"
user1:
  name: 'u1'
  <<: *defaults
user2:
  name: 'u2'
  <<: *defaults
# 对应的 json
{
    "defaults": {
        "class": "6-1",
        "teacher": "xianbin"
    },
    "user1": {
        "name": "u1",
        "class": "6-1",
        "teacher": "xianbin"
    },
    "user2": {
        "name": "u2",
        "class": "6-1",
        "teacher": "xianbin"
    }
}
其他