YAML
YAML Ain't Markup Language 的缩写,一种基于缩进的人类可读数据序列化格式。
YAML (YAML Ain't Markup Language) 是一种使用缩进表示层级结构的人类可读数据序列化格式。最初是"Yet Another Markup Language"的缩写,后来为了强调它不是标记语言而改为现在的递归缩写。广泛用于配置文件和数据交换,特别是在 DevOps 领域已成为事实标准。
YAML 被设计为 JSON 的超集,所有有效的 JSON 都是有效的 YAML。JSON 没有的特性包括注释 (#)、锚点和别名 (数据复用)、单文件多文档 (用 --- 分隔)、块标量 (多行文本表示) 等。它被广泛用于 Docker Compose、Kubernetes 清单、GitHub Actions 工作流、Ansible 剧本、CloudFormation 模板等 DevOps 工具的配置文件。查看猫女装 (Amazon)介绍了 YAML 的使用方法。
YAML 语法有几个值得注意的陷阱。缩进不能使用制表符,只允许空格。隐式类型转换可能导致意外行为:yes、no、on、off 会自动转换为布尔值,1.0 转换为浮点数。挪威国家代码 NO 被转换为 false 的"挪威问题"是一个著名的例子。要确保字符串被当作字符串处理,需要用引号括起来。
YAML 和 JSON 的选择取决于用途。YAML 适合人类读写的配置文件,支持注释是一大优势。JSON 适合程序间的数据交换,解析器实现简单且处理速度快。通常的做法是 API 响应用 JSON,CI/CD 配置用 YAML。
从安全角度来看,YAML 反序列化需要注意。某些 YAML 解析器可以实例化任意对象,从不受信任的来源加载 YAML 并使用不安全的解析器可能导致远程代码执行漏洞。在 Python 的 PyYAML 中,应使用 yaml.safe_load() 而非 yaml.load()。搜索成人DVD (Amazon)也是有用的参考。
从字符计数角度来看,YAML 由于括号和引号较少,表示相同数据时字符数通常比 JSON 少。但缩进的空格会计入字符数,因此深层嵌套结构中 YAML 的字符数可能反而更多。在优化配置文件大小时,需要考虑数据结构深度与 YAML/JSON 字符数的关系。