DevToolBox免费
博客

YAML 语法与验证:常见错误及修复方法

9 分钟阅读作者 DevToolBox

YAML 是 Docker、Kubernetes、CI/CD 流水线和无数其他工具的首选配置格式。尽管语法对人类友好,但 YAML 出错却出奇地容易。本指南涵盖最常见的 YAML 错误及修复方法。

YAML 的使用场景

  • Docker Compose (docker-compose.yml)
  • Kubernetes 清单文件
  • GitHub Actions / GitLab CI 工作流
  • Ansible 剧本
  • 配置文件(Prettier、ESLint 等)

基本 YAML 语法规则

缩进

YAML 使用空格(不能用制表符)进行缩进。同一层级的空格数必须一致:

# ✅ Correct (2-space indentation)
server:
  host: localhost
  port: 8080
  database:
    name: myapp
    pool: 10

# ❌ Wrong (tab characters or inconsistent spaces)
server:
	host: localhost    # Tab character - INVALID!
   port: 8080        # 3 spaces - inconsistent!

键值对

键和值之间用冒号加空格分隔:

# ✅ Correct
name: John Doe
port: 8080

# ❌ Wrong - missing space after colon
name:John Doe

多行字符串

YAML 提供两种块标量样式来处理多行字符串:

# | (literal block) - preserves newlines
description: |
  This is line one.
  This is line two.
  Each newline is preserved.

# > (folded block) - folds newlines to spaces
description: >
  This is a long paragraph
  that will be joined into
  a single line.

YAML 数据类型

类型语法示例
Stringplain, "quoted", 'quoted'name: John
Integer42, 0xFF, 0o77port: 8080
Float3.14, .inf, .nanpi: 3.14159
Booleantrue/falsedebug: true
Nullnull, ~, (empty)value: null
DateYYYY-MM-DDdate: 2026-02-10

"挪威问题"

在 YAML 1.1 中,`NO`(如挪威的国家代码)会被解释为布尔值 `false`。因为 YAML 1.1 将 yes/no、on/off、true/false 视为布尔值。务必给国家代码等类似值加引号:

# ❌ YAML 1.1 interprets these as booleans!
country: NO        # → false
answer: yes        # → true
switch: on         # → true

# ✅ Fix: quote the values
country: "NO"      # → string "NO"
answer: "yes"      # → string "yes"
switch: "on"       # → string "on"

集合:列表和映射

# List (sequence)
fruits:
  - apple
  - banana
  - cherry

# Nested map
database:
  host: localhost
  port: 5432
  credentials:
    user: admin
    password: secret

# Inline / Flow style
fruits: [apple, banana, cherry]
point: {x: 10, y: 20}

十大常见 YAML 错误

#错误原因修复
1Tab 字符错误使用制表符缩进将所有制表符替换为空格(2或4个)
2不一致的缩进混用 2 空格和 4 空格缩进在整个文件中使用一致的缩进
3冒号后缺少空格写成 `key:value` 而非 `key: value`冒号后始终加一个空格
4未引用的特殊字符值包含 : 或 # 但未加引号给包含特殊字符的字符串加引号
5布尔值强制转换yes/no/on/off/NO 被解释为布尔值给看起来像布尔值的值加引号:`"yes"`、`"NO"`
6包含冒号的字符串`url: http://example.com` 在第二个冒号处断开给整个值加引号:`url: "http://example.com"`
7重复的键同一个映射中出现两次相同的键删除重复的键(最后一个生效,但容易出错)
8尾部空白值后面有不可见的空格配置编辑器自动删除尾部空白
9列表缩进错误列表项与父键未对齐将 `-` 与子缩进层级对齐
10缺少文档分隔符多个文档之间没有 `---` 分隔在 YAML 文档之间添加 `---`

YAML vs JSON vs TOML

特性YAMLJSONTOML
Comments# supportNone# support
Multi-line strings| and >\\n only""" triple quotes
Data typesRich (dates, etc.)Basic (6 types)Rich (dates, etc.)
ReadabilityHighMediumHigh
Machine parsingComplexSimpleMedium
Best forConfig filesAPIs, data exchangeApp config

验证最佳实践

  • 始终在 CI/CD 流水线中使用 YAML 校验器
  • 配置编辑器显示空白字符
  • 使用 2 空格缩进(最常见约定)
  • 给可能被误解的字符串加引号(布尔值、前导零的数字)
  • 对复杂配置使用 YAML 模式验证
  • 尽可能保持 YAML 文件小而模块化

常见问题

YAML 中可以使用制表符吗?

不可以。YAML 严格禁止使用制表符缩进,必须使用空格。大多数编辑器可以配置为按 Tab 键时插入空格。

YAML 中单引号和双引号的区别?

单引号保留字面字符串(无转义序列)。双引号允许转义序列如 \n、\t 和 Unicode 转义。简单字符串用单引号,需要转义字符时用双引号。

如何在 YAML 中表示 null?

可以使用 `null`、`~` 或直接留空。三种方式等价:`key: null`、`key: ~` 和 `key:`。

为什么 YAML 将 "NO" 视为 false?

YAML 1.1 规范将 yes/no、on/off、true/false(不区分大小写)视为布尔值。YAML 1.2 修复了此问题,仅识别 true/false。为安全起见,始终给可能被解释为布尔值的字符串加引号。

𝕏 Twitterin LinkedIn
这篇文章有帮助吗?

保持更新

获取每周开发技巧和新工具通知。

无垃圾邮件,随时退订。

试试这些相关工具

YMLYAML Validator & FormatterY{}JSON ↔ YAML ConverterTYTOML ↔ YAML🐳Docker Compose Generator

相关文章

JSON 转 Dart:Flutter 模型类完全指南

学习如何将 JSON 转换为 Flutter 的 Dart 模型类。涵盖 fromJson、toJson、空安全、嵌套对象和 json_serializable。

Docker Compose YAML 验证:10 个常见语法错误及修复方法

别再浪费时间在 Docker Compose YAML 错误上。学会识别和修复 10 个最常见的语法错误。

JSON Schema 验证:类型、工具与最佳实践

关于 JSON Schema 验证的一切:从基本类型到高级模式、验证库以及与 TypeScript 和 API 的集成。

JSON 转 YAML 在线转换指南:语法、工具与最佳实践

JSON 与 YAML 转换完整指南。涵盖语法对比、js-yaml、PyYAML、ruamel.yaml、yq 命令行、Kubernetes 清单、Docker Compose、YAML 陷阱(挪威问题、布尔值)及安全最佳实践。