YAML 语义差异检查器
粘贴 YAML 文档,查看解析器遵循 YAML 1.1 还是 YAML 1.2 标签解析规则时,哪些值会被不同解释。这不是语法验证器,而是语义检查器。
在您的浏览器中本地处理。文件绝不会被上传。
使用方法 工具
- 粘贴 YAML 或上传 .yaml/.yml 文件;内容不会离开浏览器。
- 选择“检查 YAML”。
- 查看每个标记的值:在 YAML 1.1 和 YAML 1.2 下各自的含义,以及差异的影响。
- 使用建议的可移植改写,或复制完整修正文档,以消除歧义。
假设条件
- 按公布的两个 schema 直接比较(YAML 1.1 的 tag:yaml.org,2002 类型与 YAML 1.2 Core Schema),而非某个特定库的实际行为。真实解析器可能不同,例如 PyYAML 常用 SafeLoader 即使文档声明 YAML 1.2,也会采用 YAML 1.1 风格解析。
- 只检查未加引号的 plain 标量;已加引号的值(例如 `"yes"`)在所有 schema 中均无歧义,不会标记。
- 识别 `key: value` 映射,包括嵌套映射。不处理 flow 风格集合(`{a: 1}`)、块标量(`|`、`>`)及锚点/别名,详见局限。
来源与参考数据
方法说明
分别使用 YAML 1.1 标签解析正则和 YAML 1.2 Core Schema 正则解析文档中每个 plain 标量值。如果两个 schema 对结果类型或值有分歧,就会标记。布尔值/空值分歧标为可能导致问题,因为它会静默反转真/假逻辑;数字或时间戳分歧则标为需要检查,因为值或类型会变化,但较不容易直接反转条件判断。
计算示例
经典的“挪威问题”
输入项: country: NO
结果: YAML 1.1 将 NO 解释为布尔值 false;YAML 1.2 将其解释为字符串“NO”。标记为可能导致问题,并建议写作 `country: "NO"`。
带前导零的数字
输入项: retries: 0123
结果: YAML 1.1 将 0123 解释为八进制(83);YAML 1.2 将其解释为十进制(123),同一文本表示两个不同数字。
实用指南
- 如果某个值本应保持字符串,请给可能被误解为布尔值、空值或数字的值加引号;常见情况包括国家代码(NO、ON)、看起来像版本号的字符串以及 yes/no/on/off。
- 若能控制解析器,请明确设为 YAML 1.2 Core Schema 行为,不要依赖库的历史默认值。
常见错误
- 以为肉眼看起来正确的 YAML 在所有地方都会相同解析;有歧义的情况恰好常像普通值。
- 只依赖 `%YAML 1.2` 指令;一些常用解析器并不完全遵循它,仍采用 YAML 1.1 风格标量解析。
常见问题
为什么 `enabled: yes` 会变成 true?
YAML 1.1 布尔词列表会把任意大小写组合的“yes”解析为 true。YAML 1.2 Core Schema 只将 true/false 识别为布尔值,因此同一文本会保留为字符串“yes”。
YAML 的挪威问题是什么?
挪威的 ISO 国家代码 NO 同时也是 YAML 1.1 中表示 false 的布尔词之一。因此在 YAML 1.1 解析器中,未加引号的 `country: NO` 会静默变成 `country: false`。
给值加引号总是安全吗?
是。带引号的标量(`"yes"`、`'NO'`)在所有 YAML schema 中都会被当作显式字符串。本工具不会标记已加引号的值。
为什么 PyYAML 会把 `yes` 或 `no` 变成布尔值?
PyYAML 常用 SafeLoader 应用 YAML 1.1 风格布尔解析,其中 plain `yes` 为 true、`no` 为 false。因此 `country: NO` 可能加载为布尔值,而 YAML 1.2 Core Schema 会保留 NO 为字符串。本工具比较公布的 schema 规则,不会运行 PyYAML 或验证具体加载器配置。
上次审核:
这是标量解析检查器,而非完整 YAML 解析器:不分析 flow 集合、块标量、锚点/别名或合并键(更广泛检查请用 YAML 跨运行环境预检)。它比较公布的两个 schema,而非特定库的实际行为;实际行为有时会偏离规范,详见假设。
主题和工具偏好设置,以及已保存和最近使用的列表仅存储在此浏览器中。