乐闻世界logo
搜索文章和话题

YAML 支持哪些数据类型?如何正确使用它们?

2月21日 14:20

YAML 支持多种数据类型,理解这些类型对于正确编写和解析 YAML 文件至关重要。

YAML 数据类型分类

1. 标量类型(Scalars)

字符串(String)

  • 普通字符串:不需要引号
  • 带引号字符串:单引号或双引号
  • 多行字符串:使用 |>
yaml
# 普通字符串 name: John Doe # 单引号字符串(不转义特殊字符) message: 'Hello\nWorld' # 双引号字符串(转义特殊字符) greeting: "Hello\nWorld" # 多行字符串(保留换行) description: | This is a multi-line string # 多行字符串(折叠换行) summary: > This is a folded string that becomes one line

数字(Number)

  • 整数:十进制、八进制(0o)、十六进制(0x)
  • 浮点数:支持科学计数法
yaml
integer: 42 octal: 0o52 hex: 0x2A float: 3.14 scientific: 1.23e4 negative: -42

布尔值(Boolean)

  • 支持多种表示方式
yaml
true_value: true false_value: false yes: yes no: no on: on off: off

空值(Null)

  • 多种表示方式
yaml
empty: null none: ~ empty2:

2. 集合类型(Collections)

列表/数组(List/Array)

  • 使用连字符 - 表示
  • 支持内联表示法
yaml
# 标准列表 fruits: - apple - banana - orange # 内联列表 colors: [red, green, blue] # 嵌套列表 matrix: - [1, 2, 3] - [4, 5, 6] - [7, 8, 9]

映射/字典(Map/Dictionary)

  • 使用键值对表示
  • 支持内联表示法
yaml
# 标准映射 person: name: Alice age: 30 city: Beijing # 内联映射 config: {host: localhost, port: 8080} # 嵌套映射 server: database: host: db.example.com port: 5432 cache: type: redis ttl: 3600

3. 复杂类型

混合类型(混合列表和映射)

yaml
users: - name: Bob age: 25 skills: [Python, JavaScript] - name: Carol age: 28 skills: [Java, Go]

自定义类型

yaml
# 使用 !! 标签指定类型 timestamp: !!timestamp 2024-01-01T00:00:00Z binary: !!binary | SGVsbG8gV29ybGQ=

类型推断规则

YAML 解析器会根据值的格式自动推断类型:

  1. 数字:纯数字序列
  2. 布尔值:true/false, yes/no, on/off
  3. 空值:null, ~, 空字符串
  4. 字符串:其他所有情况

类型转换技巧

强制指定类型

yaml
# 使用引号强制为字符串 port: "8080" # 字符串,不是数字 # 使用 !! 标签指定类型 age: !!int "25" # 强制转换为整数

特殊字符处理

yaml
# 包含特殊字符的字符串需要引号 path: "/usr/local/bin" regex: "\\d+"

常见错误

  1. 类型混淆:期望字符串但得到数字
  2. 布尔值误判:yes/no 被解释为布尔值
  3. 日期格式:某些日期格式被自动转换为时间戳
  4. 引号使用不当:导致转义字符失效

最佳实践

  1. 对于明确需要字符串的值,使用引号
  2. 对于配置项,使用明确的类型标注
  3. 避免使用 yes/no 作为字符串值
  4. 使用 YAML Schema 进行类型验证
  5. 保持类型一致性,不要混用不同表示方式
标签:YAML