Yaml 介绍

发布时间: 更新时间: 总字数:1184 阅读时间:3m 作者: IP上海 分享 网址

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"
    }
}

其他

参考

  1. https://yaml.org/
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数