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)
- 浮点数:支持科学计数法
yamlinteger: 42 octal: 0o52 hex: 0x2A float: 3.14 scientific: 1.23e4 negative: -42
布尔值(Boolean)
- 支持多种表示方式
yamltrue_value: true false_value: false yes: yes no: no on: on off: off
空值(Null)
- 多种表示方式
yamlempty: 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. 复杂类型
混合类型(混合列表和映射)
yamlusers: - 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 解析器会根据值的格式自动推断类型:
- 数字:纯数字序列
- 布尔值:true/false, yes/no, on/off
- 空值:null, ~, 空字符串
- 字符串:其他所有情况
类型转换技巧
强制指定类型
yaml# 使用引号强制为字符串 port: "8080" # 字符串,不是数字 # 使用 !! 标签指定类型 age: !!int "25" # 强制转换为整数
特殊字符处理
yaml# 包含特殊字符的字符串需要引号 path: "/usr/local/bin" regex: "\\d+"
常见错误
- 类型混淆:期望字符串但得到数字
- 布尔值误判:yes/no 被解释为布尔值
- 日期格式:某些日期格式被自动转换为时间戳
- 引号使用不当:导致转义字符失效
最佳实践
- 对于明确需要字符串的值,使用引号
- 对于配置项,使用明确的类型标注
- 避免使用 yes/no 作为字符串值
- 使用 YAML Schema 进行类型验证
- 保持类型一致性,不要混用不同表示方式