Switch to English
什么是 Norway Bug?
YAML 解析中的经典陷阱
Norway Bug 是 YAML 解析中最常见也最容易被忽视的问题之一。它因挪威的国家代码 "NO" 而得名,但影响范围远不止于此。
⚠️问题描述
YAML 规范定义了许多字符串会被自动解释为布尔值,这常常与开发者的预期不符。当你写下 `country: NO` 时,YAML 解析器会将 `NO` 解释为布尔值 `false`,而不是字符串 `"NO"`。
问题示例
看看这些常见的 Norway Bug 实例:
❌原始 YAML(有问题)
country: NO # 被解析为 false enabled: Yes # 被解析为 true debug: On # 被解析为 true region: off # 被解析为 false status: TRUE # 被解析为 true
✅修复后的 KYAML
{ "country": "NO", # 明确的字符串 "enabled": "Yes", # 明确的字符串 "debug": "On", # 明确的字符串 "region": "off", # 明确的字符串 "status": "TRUE", # 明确的字符串 }
受影响的值
以下是 YAML 规范中会被解释为布尔值的字符串:
被解释为 true 的值
true
True
TRUE
yes
Yes
YES
on
On
ON
被解释为 false 的值
false
False
FALSE
no
No
NO
off
Off
OFF
注意:这些值不区分大小写,也可以是部分大写的组合。
影响范围
Norway Bug 可能造成的问题:
- 1配置文件中的国家代码被错误解析
- 2开关状态的字符串表示被意外转换
- 3数据导入时的类型错误
- 4生产环境中的意外行为
- 5调试困难,因为错误不明显
解决方案
有几种方法可以避免 Norway Bug:
1. 添加引号
最直接的方法是给这些值加上引号。
country: "NO" # 明确指定为字符串
enabled: "Yes" # 避免布尔值转换
2. 使用 KYAML 格式
KYAML 强制所有字符串使用双引号,完全避免此问题。
{
"country": "NO",
"enabled": "Yes",
}
3. 改变值的表示方式
使用更明确的值来避免歧义。
country: Norway
enabled: true # 如果确实想要布尔值
🚀KYAML 的优势
KYAML 通过以下方式完全解决 Norway Bug:
- ✓所有字符串值都使用双引号包围
- ✓明确的类型表示,减少歧义
- ✓自动检测和修复潜在的 Norway Bug
- ✓保持数据的原始意图
如何预防
在日常开发中,你可以:
- 1使用我们的在线转换器检查 YAML 文件
- 2在 CI/CD 流程中集成 KYAML 验证
- 3团队制定 YAML 编写规范
- 4使用支持 Norway Bug 检测的编辑器插件