JSONとYAMLのブーリアン値の違い
JSONとYAMLでブーリアン値がどのように異なる扱いを受けるかを理解します。YAMLの拡張ブーリアンリテラル(yes/no、on/off)とよくある変換の落とし穴を解説します。
Data Types
詳細な説明
ブーリアン値の扱いは、JSONとYAML間の変換でバグの原因となることが最も多い部分の一つです。JSONには true と false の2つのブーリアン値しかありません。一方、YAMLははるかに広範なブーリアン風の値を認識します。
JSONのブーリアン(厳密):
{
"enabled": true,
"debug": false
}
YAMLの等価表現:
enabled: true
debug: false
これは単純です。しかしYAML(バージョン1.1)では以下もブーリアンとして扱われます:
| 真 | 偽 |
|---|---|
true |
false |
True |
False |
TRUE |
FALSE |
yes |
no |
Yes |
No |
YES |
NO |
on |
off |
On |
Off |
ON |
OFF |
ノルウェー問題: これはYAMLで有名な落とし穴です。国コードのマッピングを考えてみましょう:
countries:
- code: GB
- code: FR
- code: NO
YAML 1.1では、NO はブーリアンの false として解釈され、文字列 "NO" にはなりません。JSONに変換すると:
{ "countries": [{"code": "GB"}, {"code": "FR"}, {"code": false}] }
修正方法 -- 値をクォートする:
- code: "NO"
YAML 1.2(最新仕様) ではブーリアンを true と false(小文字のみ)に限定しており、これらの問題は大幅に軽減されます。ただし、多くのパーサーはまだYAML 1.1の動作がデフォルトです。
JSONからYAMLに変換する際、ツールは "yes", "no", "on", "off" などの文字列をクォートして、ラウンドトリップ時にブーリアンとして誤解釈されることを防ぐべきです。
ユースケース
CI/CDパイプラインで、GitHub Actionsワークフローの 'on: push' のようなYAML設定値がトリガー名の文字列ではなくブーリアンとして解析されていた問題のデバッグ。