2026 年 YAML“挪威难题”仍未解决,流行库为何还停留在旧版本?
YAML“挪威难题”深入探讨
2026 年 1 月 12 日,文章深入探讨 YAML 的“挪威难题”,包括为何国家代码 NO 会被解析为 false,从 YAML v1.0 到 v1.2 该问题的演变历程,以及为何到 2026 年流行库仍存在此问题。
什么是 YAML
YAML 是一种知名的数据序列化语言,设计初衷是便于人类阅读,是配置文件和元数据的常用选择。给出示例后,使用 Python 搭配 PyYaml 6.0.3 版本进行验证,展示了安装库、编写解析脚本及运行结果。截至 2026 年 1 月,Python 是全球第四大最受欢迎的编程语言,PyYaml 是 Python 中最受欢迎的 YAML 库,也是过去一个月内 Python 整体排名前 20 的库,其源代码托管在由 YAML 的 Github 账户拥有的仓库中。
YAML 中的“挪威难题”
修改原始 YAML 文件添加挪威国家代码 NO 后,解析结果中 NO 被替换成 false。该特性最初是为让布尔值书写更符合人类阅读习惯,但实践中引发问题,成为“挪威难题”。一种解决方法是对字符串进行转义,加引号后文件能按预期解析。然而,许多文章将加引号作为标准解决方案,实际还有更多内容。
YAML 的历史
为理解“挪威难题”现状,回顾 YAML 演变过程:2001 年 5 月 YAML 首版规范,当时更像概念,文档未提及将 no 解析为 false;2004 年 1 月 YAML v1.0 最终草案,描述多种表示标量方式,使“挪威难题”有出现可能;2005 年 1 月 YAML v1.1 最终草案,保留与 v1.0 相同隐式类型行为,类型虽非强制但强烈推荐;2009 年 7 月 YAML 修订版 1.2.0,目标是使 YAML 与 JSON 兼容,隐式类型规则被移除,理论上“挪威难题”应不再存在。还列出 YAML 规范版本历史至 v1.2.0 的表格。
YAML 的实际应用
YAML 及其规范非常复杂,自 v1.0 起在多种技术基础上构建,支持多种特性。修订版 v1.2 简化了布尔值等方面行为,其他语言特性保持不变。库如何应对复杂规范变更值得思考。
YAML 库
截至 2026 年 1 月,流行的 YAML 库仍未从 v1.1 迁移到 v1.2,存在“挪威难题”。一些较小替代项目使用量未超现有 v1.1 库,部分用户构建自己的替代解析器。如 PyYaml 从未添加对 v1.2 的支持,Github 项目有未解决问题;LibYaml 也未添加对 v1.2 的支持,Github 项目有始于 2016 年的未解决问题;Golang 的 gopkg.in/yaml.v3 已停止维护,声明支持 v1.1 和 v1.2 混合特性,Golang 中最受欢迎的活跃维护库默认采用 v1.2 行为;Kyaml 是为 Kubernetes 项目构建的 YAML 方言,目标是提供更安全、歧义更少的工具,发布公告提及“挪威难题”。
“挪威难题”解决了吗
YAML 生态系统包括库和用户社区,对“挪威难题”存在强烈且相互冲突的观点。许多文本不区分 YAML 规范版本,易出现错误。一些用户认为问题已解决,而从实践看,大多数广泛采用的实现仍支持隐式布尔类型。部分终端用户对 YAML 不满。
下一步是什么
YAML v1.0 草案规定部分字符解析为布尔值,v1.1 移除相关内容。尽管 YAML 有怪癖,但仍受欢迎且广泛使用,规范变更引入缓慢。新项目可能采用较新库,“挪威难题”在这些库中已不存在。YAML 生态系统碎片化,正朝着更严格版本发展,隐式布尔类型在官方规范中已移除,但旧库仍停留在旧版本,更新或淘汰需时间。
常见问题解答
为什么不直接用 JSON 代替 YAML:常见回答是 JSON 不支持注释及许多 YAML 特性,是否适合项目取决于项目本身和个人偏好,JSON 有变体如 JSONC。YAML 是 JSON 的超集吗:不太确定,YAML 修订版 v1.2.0 目标是实现,但最新修订版 1.2.2 相关表述已删除,实际因 YAML 要求映射键唯一,而 JSON 只是建议,存在模糊之处。哪里出了问题:当复杂技术引入重大变更,过程可能漫长,YAML 复杂,任何人可贡献或转向更适合工具。那么 TOML、六十进制数、模式、人类基因、Ruby 或 Perl 呢:这些主题与“挪威难题”间接相关,文章已长,若读者喜欢可期待第二部分,可访问主页查看其他项目。
结语
隐式布尔类型已被移除,但显式布尔类型仍存在。若统一的 YAML 1.2 未来到来,可在代码中保留怀旧元素。使用 yq 解析含显式类型的 YAML 文件,可得到预期结果。
