2026 年 YAML“挪威难题”仍未解决,流行库为何还停留在旧版本? YAML“挪威难题”深入探讨2026 年 1 月 12 日文章深入探讨 YAML 的“挪威难题”包括为何国家代码 NO 会被解析为 false从 YAML v1.0 到 v1.2 该问题的演变历程以及为何到 2026 年流行库仍存在此问题。什么是 YAMLYAML 是一种知名的数据序列化语言设计初衷是便于人类阅读是配置文件和元数据的常用选择。给出示例后使用 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 解析为 false2004 年 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 文件可得到预期结果。