JSONとYAMLのブーリアン値の違い

JSONとYAMLでブーリアン値がどのように異なる扱いを受けるかを理解します。YAMLの拡張ブーリアンリテラル(yes/no、on/off)とよくある変換の落とし穴を解説します。

Data Types

詳細な説明

ブーリアン値の扱いは、JSONとYAML間の変換でバグの原因となることが最も多い部分の一つです。JSONには truefalse の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(最新仕様) ではブーリアンを truefalse(小文字のみ)に限定しており、これらの問題は大幅に軽減されます。ただし、多くのパーサーはまだYAML 1.1の動作がデフォルトです。

JSONからYAMLに変換する際、ツールは "yes", "no", "on", "off" などの文字列をクォートして、ラウンドトリップ時にブーリアンとして誤解釈されることを防ぐべきです。

ユースケース

CI/CDパイプラインで、GitHub Actionsワークフローの 'on: push' のようなYAML設定値がトリガー名の文字列ではなくブーリアンとして解析されていた問題のデバッグ。

試してみる — JSON ↔ YAML Converter

フルツールを開く