Skip to content

YAML – Failsafe Schema (故障安全模式)

YAML - Failsafe Schema (故障安全模式)

Section titled “YAML - Failsafe Schema (故障安全模式)”

YAML 模式(Schema)定义了如何将 YAML 标签(Tag)解析为原生数据类型。Failsafe Schema 是最基础、最普遍兼容的模式。它保证任何 YAML 文档都能被解析,但它仅识别三种基本数据结构:通用映射(generic mappings)、通用序列(generic sequences)和通用字符串(generic strings)。它不执行任何隐式类型转换(例如,‘true’ 仍然是字符串,而不是布尔值;‘123’ 仍然是字符串,而不是整数)。

当未指定其他模式,或者 YAML 处理器需要为未知标签提供回退机制时,会隐式使用 Failsafe Schema。它通过对数据的含义做出最少的假设来确保互操作性。

表示一种关联容器,其中键(key)是唯一的,并映射到值(value)。在 Failsafe Schema 中,除非通过更具体的模式明确标记,否则键和值通常都被视为通用字符串。

通用映射示例:

# YAML 内容
authors:
"Clark Evans": "YAML Specification Co-author"
"Ingy döt Net": "YAML Specification Co-author"
"Oren Ben-Kiki": "YAML Specification Co-author"
# 显式使用 !!map 标签(通常会自动推断)
flow_style_map:
!!map {name: "Alice", role: "Developer"}

使用 Failsafe Schema 解析时,其结构被保留为键值对,其中键和值均为通用字符串:

# 概念性的 JSON 表示(所有值均为字符串)
{
"authors": {
"Clark Evans": "YAML Specification Co-author",
"Ingy döt Net": "YAML Specification Co-author",
"Oren Ben-Kiki": "YAML Specification Co-author"
},
"flow_style_map": {
"name": "Alice",
"role": "Developer"
}
}

表示一个有序的项集合,通过从零开始的连续整数进行索引。在 Failsafe Schema 中,序列中的项被视为通用字符串。

# 序列的 YAML 内容
contributors:
- "Clark Evans"
- "Ingy döt Net"
- "Oren Ben-Kiki"
# 显式使用 !!seq 标签表示流式序列
flow_style_seq: !!seq ["item1", "item2", "item3"]

这个通用序列的概念性 JSON 表示将是:

# 概念性的 JSON 表示(所有项均为字符串)
{
"contributors": [
"Clark Evans",
"Ingy döt Net",
"Oren Ben-Kiki"
],
"flow_style_seq": [
"item1",
"item2",
"item3"
]
}

表示一个标量值,作为 Unicode 字符的序列。所有未加引号的标量、单引号标量、双引号标量、字面量块标量和折叠块标量,如果未被其他模式(如 JSON 或 Core Schema)解析,在 Failsafe Schema 中都默认为通用字符串。

# YAML 内容
message: Hello, world!
quoted_message: "123"
boolean_like_string: 'true'

在 Failsafe Schema 中,这些都将被解释为字符串:

# 概念性的 JSON 表示
{
"message": "Hello, world!",
"quoted_message": "123",
"boolean_like_string": "true"
}

Failsafe Schema 之所以基础,是因为它为 YAML 处理提供了一个基线,确保任何文档至少可以作为映射、序列和字符串的结构被加载。更高级的模式,如 JSON Schema 或 Core Schema,在此基础上增加了将标签解析为更具体类型(如整数、布尔值、空值等)的规则。