Skip to content

YAML – 集合与结构

YAML 的强大之处在于它能够通过集合(collection)(如序列 sequence 和映射 mapping)来表示结构化数据,并能在文档(document)中组织这些集合。本章将探讨这些元素如何组合起来形成复杂的数据结构。

块集合使用缩进来定义范围和结构。块集合中的每个项目通常都始于新的一行。

块序列表示有序的项目列表。每个项目都以破折号和空格 (- ) 开头。

# 玩家姓名序列(标量)
players:
- Mark Joseph
- James Stephen
- Ken Griffey

块映射表示键值对(key-value pairs)。每对键值占据一行,键后面跟着冒号和空格 (: )。

# 玩家统计数据映射(标量到标量)
stats:
hr: 87 # 全垒打
avg: 0.298 # 打击率
rbi: 149 # 打点

集合可以嵌套,以创建更复杂的数据层次结构。

leagues:
european:
- Boston Red Sox
- Detroit Tigers
- New York Yankees
national:
- New York Mets
- Chicago Cubs
- Atlanta Braves

这是一种非常常见的模式,代表一个对象列表。

player_details:
- name: Mark Joseph
hr: 87
avg: 0.278
- name: James Stephen
hr: 63
avg: 0.288

提醒一下,YAML 也支持集合的流式(内联)样式,使用显式指示符:

  • 流式序列:[item1, item2, item3]
  • 流式映射:{key1: value1, key2: value2}
languages: [PHP, Perl, Python]
coordinates: {x: 10, y: 20, z: 5}

流式样式常用于简单集合,或在嵌套于块结构中时使用。

一个 YAML 流(stream)可以包含多个文档(document)。这对于连接独立的 YAML 文件或将相关但不同的数据集分组非常有用。

  • 文档开始符 (---):三个连字符表示流中新 YAML 文档的开始。
  • 文档结束符 (...):三个点可选地标记文档的结束。这对于在新文档开始之前发出文档结束信号,或用于流处理非常有用。
# 文档 1:1998 年全垒打排名
---
- Mark Joseph
- James Stephen
- Ken Griffey
...
# 文档 2:球队排名
---
- Chicago Cubs
- St Louis Cardinals
# 流结束,... 在此可选

实际应用:Kubernetes 配置文件常使用 --- 在单个 .yaml 文件中分隔多个资源定义(例如,一个 Deployment 和一个 Service)。

虽然大多数映射键是简单的标量(字符串),但 YAML 允许使用复杂键(complex keys),例如序列或映射本身。为了清晰地表示复杂键,可以在键之前使用问号和空格 (? )。

# 以序列作为键的映射
match_dates:
? [New York Yankees, Atlanta Braves] # 复杂键
: [2001-07-02, 2001-08-12, 2001-08-14] # 复杂键的值
? [Boston Red Sox, Florida Marlins]
: [2001-07-04, 2001-08-16]
# 另一个结构更显式的示例
# 这表示一个映射条目的开始,其中键本身具有结构
? - 键序列中的项1
- 键序列中的项2
: 序列键的值

复杂键不太常见,但在表示某些类型的数据关系时非常强大。然而,为了简单性和更广泛的兼容性(尤其是在转换为 JSON 时,JSON 只允许字符串键),通常首选使用标量键。

通过组合这些集合类型并在文档中组织它们,YAML 提供了一种灵活且易于阅读的方式来建模各种数据。