ブラウザ内ツール

YAML ⇄ JSON 変換

YAML と JSON を相互変換します。ただの変換にとどまらず、YAMLで最も事故が多い「引用符を付け忘れた値が、意図せず数値・真偽値・日付に化ける」問題を、行番号つきで警告します。すべてブラウザ内で処理し、貼り付けた内容は送信しません

すべてブラウザ内で処理・送信なし
YAML 入力
JSON 出力
{
  "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

引用符で囲まなかったために、意図せず数値・真偽値・日付などに化ける値です。

2行目真偽値と誤解されうる: NONOfalse

YAML 1.1(PyYAML など多くの実装)は NO を false と解釈します。国コード NO(ノルウェー)が false になる有名な「Norway問題」。※このツール(JS/1.2寄り)は文字列のまま保ちますが、他実装に渡すと壊れます。

対策: 文字列なら引用符で囲む: "NO"

3行目真偽値と誤解されうる: yesyestrue

YAML 1.1(PyYAML など多くの実装)は yes を true と解釈します。国コード NO(ノルウェー)が false になる有名な「Norway問題」。※このツール(JS/1.2寄り)は文字列のまま保ちますが、他実装に渡すと壊れます。

対策: 文字列なら引用符で囲む: "yes"

4行目60進数になる: 22:2222:221342

: 区切りは60進数として数値化されます。このツールでも 22:22 → 1342。時刻や MAC 風の値が別物になります。

対策: 引用符で囲む: "22:22"

5行目8進数になる: 0100108

先頭の 0 は8進数と解釈されます。このツールでも 010 → 8。ゼロ埋めの番号(社員番号・部屋番号)が化けます。

対策: 引用符で囲む: "010"

6行目末尾ゼロが落ちる: 1.201.201.2

数値化で末尾の 0 が消えます。このツールでも 1.20 → 1.2。バージョン 1.10 が 1.1 になる典型例です。

対策: バージョン等は引用符で "1.20"

7行目精度が落ちる大整数: 12345678901234567890

安全な整数の上限(2^53)を超えると精度が失われます。ID やスノーフレークが別の数値に化けます。

対策: 引用符で囲む: "12345678901234567890"

8行目日付になる: 2002-12-14

ISO 風の日付は timestamp(Date型)に変換されます。文字列のつもりが日付オブジェクトになり、JSON化で書式が変わります。

対策: 文字列で欲しいなら "2002-12-14"

9行目Infinity / NaN になる: .inf

.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:221342(22×60+22)に。時刻や比率が数値に化ける。
  • 8進数化・桁落ち: 01081.201.2、巨大IDは精度が落ちる。
  • 日付化: 2002-12-14 が文字列でなく日付オブジェクトになる。

対策はどれも同じで「文字列として扱いたい値は引用符で囲む」だけです。 この変換ツールはJavaScriptのYAML実装(1.2寄り)で動くため no/yes は文字列のまま保ちますが、PyYAMLなど多くの実装では化けるため、警告として明示しています。