YAML 配置 (.yaml)
YAML 标准YAML Ain't Markup Language(YAML)是现代 DevOps、云基础设施(Kubernetes、Docker Compose)和 CI/CD 自动化领域的主流数据序列化格式,它通过清晰的空白缩进来强调人类可读性。
将 YAML 转换为 JSON
免费的浏览器端 YAML 转 JSON 转换器。在您的设备上即时转换文件。
检查与元数据
操作系统和文件分析器通过检查开头的二进制字节序列来识别 YAML 文件:
字节级文件头签名 (魔数)
操作系统和文件分析器通过检查开头的二进制字节序列来识别 YAML 文件:
十六进制签名 (偏移量 0):
2D 2D 2D 0AASCII 表示形式: ---\n
标准化: YAML 1.2.2 规范
技术规格
| 容器架构 | 基于缩进、便于阅读的数据序列化格式,是 JSON 的超集,支持锚点和别名 |
| 压缩方式 | 未压缩文本流 |
| 字节序 | UTF-8 / Unicode 文本流 |
| 色彩空间 | 不适用(数据序列化) |
| 通道与结构 | 映射(键值字典)、序列(列表)、标量类型(字符串、数字、布尔值)以及锚点(&ref/*ref) |
| 最大尺寸 | 文档大小不限(支持以“---”分隔的多文档数据流) |
| 透明度 | 不支持 |
| 流式传输与渐进式加载 | 支持多文档数据流,可逐个顺序处理文档 |
技术对比矩阵:YAML 对比同类产品
| 技术属性 | YAML (当前) | JSON | TOML | XML |
|---|---|---|---|---|
| 语法风格 | 缩进空白层级 | 严格的方括号和引号 | 表格和 key=value 键值对 | 冗长的开始/结束标签 |
| 注释支持 | 原生(# 注释) | 不允许注释 | 原生(# 注释) | <!-- 注释 --> |
| DevOps 采用度 | 软件支持情况因程序而异。 | 软件支持情况因程序而异。 | Rust/Python 包配置 | 企业传统配置 |
| 数据重用 | 原生锚点 (&) 和别名 (*) | 无(手动重复) | 无(手动重复) | XML 实体 |
常见损坏模式与十六进制恢复指南
解析器错误:'mapping values are not allowed here'(此处不允许映射值)或缩进错误。
根本原因: 混合使用制表符与空格,或未对齐的缩进级别。
恢复方法: 将制表符转换为空格并使用 File2File.app YAML 格式化工具验证语法。
安全分析与解析器攻击向量
支持自定义类型标签的 YAML 解析器(如 PyYAML 的 'yaml.load()')历史上曾允许通过任意对象实例化执行远程代码。
已知攻击向量
- 通过不安全的对象反序列化标签(例如 '!!python/object/apply')执行任意代码。
- 实体扩展炸弹(类似利用 YAML 锚点和别名实施的“十亿笑”攻击)。
- 由于隐式布尔值和时间戳解析导致的类型混淆漏洞。
防御性最佳实践: 始终使用安全的 YAML 解析器(例如 Python 中的“yaml.safe_load()”),并限制锚点展开深度。
历史渊源与里程碑
2021发布 YAML 1.2.2 修订版,完善了 JSON 兼容性和形式语法定义。
2009YAML 1.2 将 YAML 标准化为 JSON 的严格超集,这意味着所有有效的 JSON 都是有效的 YAML。
2001Clark Evans、Ingy döt Net 和 Oren Ben-Kiki 创建 YAML 作为 XML 的人类友好替代品。
核心优势与特点
- YAML 常用于基础设施工具,但支持情况和行为因实现而异。
- 干净、可读的语法:通过直观的缩进消除了大括号、方括号和引号的杂乱。
- 支持引用和锚点(&anchor / *anchor),以复用配置块,避免重复编写。
技术局限与劣势
- 对空白敏感:意外的制表符或单个多余的空格可能会破坏文档层级或导致解析错误。
- 类型自动转换容易出错:未加引号的“no”、“on”、“yes”或国家代码(如挪威代码“NO”)可能会被静默解析为布尔值。
- 与二进制格式或严格的 JSON 相比,解析速度明显较慢。
趣味技术冷知识
- YAML 最初代表“Yet Another Markup Language”(又一种标记语言),后来为了强调其数据序列化用途,被幽默地改成递归缩写“YAML Ain’t Markup Language”(YAML 不是标记语言)。
- “挪威问题”是一个著名的编程错误,其中 YAML 文件中的国家代码 'NO' 被解析为布尔值 'false'。
- 世界上每个有效的 JSON 文件也都是 100% 有效的 YAML 文件。
常见技术问题
YAML 的用途是什么?
YAML 是云计算、Kubernetes 集群部署、Docker Compose 文件、GitHub Actions 工作流和软件设置的主要配置语言。
我可以在 YAML 文件中使用制表符(Tab)吗?
不可以。官方 YAML 规范严格禁止使用制表符进行缩进;您必须始终使用空格(通常每级 2 个空格)。
如何将 YAML 转换为 JSON?
您可以直接在网页浏览器中使用 File2File.app,在保护隐私的同时一键将 YAML 文件转换为格式清晰且经过验证的 JSON。