ブラウザ内ツール
YAML ⇄ JSON 変換
YAML と JSON を相互変換します。ただの変換にとどまらず、YAMLで最も事故が多い「引用符を付け忘れた値が、意図せず数値・真偽値・日付に化ける」問題を、行番号つきで警告します。すべてブラウザ内で処理し、貼り付けた内容は送信しません。
{
"country": "NO",
"enabled": "yes",
"port": 1342,
"room": 8,
"version": 1.2,
"id": 12345678901234567000,
"released": "2002-12-14T00:00:00.000Z",
"timeout": null,
"note": "NO"
}型変換の警告 8 件
引用符で囲まなかったために、意図せず数値・真偽値・日付などに化ける値です。
YAML 1.1(PyYAML など多くの実装)は NO を false と解釈します。国コード NO(ノルウェー)が false になる有名な「Norway問題」。※このツール(JS/1.2寄り)は文字列のまま保ちますが、他実装に渡すと壊れます。
対策: 文字列なら引用符で囲む: "NO"
YAML 1.1(PyYAML など多くの実装)は yes を true と解釈します。国コード NO(ノルウェー)が false になる有名な「Norway問題」。※このツール(JS/1.2寄り)は文字列のまま保ちますが、他実装に渡すと壊れます。
対策: 文字列なら引用符で囲む: "yes"
: 区切りは60進数として数値化されます。このツールでも 22:22 → 1342。時刻や MAC 風の値が別物になります。
対策: 引用符で囲む: "22:22"
先頭の 0 は8進数と解釈されます。このツールでも 010 → 8。ゼロ埋めの番号(社員番号・部屋番号)が化けます。
対策: 引用符で囲む: "010"
数値化で末尾の 0 が消えます。このツールでも 1.20 → 1.2。バージョン 1.10 が 1.1 になる典型例です。
対策: バージョン等は引用符で "1.20"
安全な整数の上限(2^53)を超えると精度が失われます。ID やスノーフレークが別の数値に化けます。
対策: 引用符で囲む: "12345678901234567890"
ISO 風の日付は timestamp(Date型)に変換されます。文字列のつもりが日付オブジェクトになり、JSON化で書式が変わります。
対策: 文字列で欲しいなら "2002-12-14"
.inf は Infinity、.nan は NaN。JSON には存在しない値なので、変換すると null などに化けます。
対策: 文字列なら ".inf"
なぜ YAML は値が化けるのか
YAMLは引用符の無いスカラー値の型を、中身から推測します。 この「親切」が曲者で、文字列のつもりの値が勝手に別の型になります。代表格がNorway問題—— 国コード NO が真偽値 false と解釈され、 国リストからノルウェーだけが消える、という実際に起きた事故です。
- 真偽値化(Norway問題):
no / yes / on / offが YAML 1.1(PyYAMLなど)でfalse / trueになる。 - 60進数化:
22:22が1342(22×60+22)に。時刻や比率が数値に化ける。 - 8進数化・桁落ち:
010が8、1.20が1.2、巨大IDは精度が落ちる。 - 日付化:
2002-12-14が文字列でなく日付オブジェクトになる。
対策はどれも同じで「文字列として扱いたい値は引用符で囲む」だけです。 この変換ツールはJavaScriptのYAML実装(1.2寄り)で動くため no/yes は文字列のまま保ちますが、PyYAMLなど多くの実装では化けるため、警告として明示しています。