JSON と YAML は、同じもの——オブジェクト・リスト・文字列・数値・真偽値からなる構造化データ——を書く 2 つの方法です。JSON は波かっことカンマで包み、YAML はインデントと改行を使います。表現する構造は同一なので無損で相互変換できますが、知っておくべき落とし穴がいくつかあります。
同じデータ、2 つのスタイル
JSON:
{ "name": "Yunknow", "tags": ["free", "fast"], "active": true }
YAML:
name: Yunknow
tags:
- free
- fast
active: true
同じデータの着替えです。YAML は記号を省いてインデントに頼ります。設定ファイルで好まれる理由がこれです。
どちらを使うか
- JSON——API、
package.json、プログラムが自動で読み書きするもの。厳密で曖昧さがなく、広く対応。 - YAML——手で編集する設定:Docker Compose、Kubernetes、GitHub Actions、CI パイプライン。読みやすく、コメントも書けます。
よくある流れは、YAML で設定を書き、ツールがそれを JSON として読み込むことです。
つまずきやすい落とし穴
- YAML のインデントは意味を持つ。 タブと空白の混在やインデントの誤りは、意味を変えたり解析を壊したりします。必ず空白でインデントを。
- JSON にするとコメントは消える。 JSON にはコメント構文がないため、YAML → JSON で
# メモ行は失われます。これは正常でバグではありません。 - 「ノルウェー問題」。 古い YAML では引用符なしの
no・yes・on・offが真偽値になり、国コードNOがfalseになり得ます。真偽値に見える文字列は引用符で囲みましょう。 - アンカーは展開される。 YAML の
&anchor/*refによる再利用は、JSON 変換時にフラットな普通のデータに展開されます。
機能の比較
| 機能 | JSON | YAML |
|---|---|---|
| コメント | なし | あり(#) |
| 末尾カンマ | 不可 | 該当なし |
| 人間の読みやすさ | 良い | 深い入れ子で有利 |
| 解析速度 | 速い | 遅い |
| 複数行文字列 | エスケープ \n のみ | ブロックスカラー |
| 1 ファイルに複数文書 | 不可 | 可(--- 区切り) |
見落とされがちな YAML の便利機能が、長文向けのブロックスカラーです。リテラルブロックは改行を保持し、折り畳みブロックは複数行を 1 行にまとめます:
description: |
1 行目はそのまま。
2 行目もそのまま。
summary: >
これは複数の
ソース行にまたがりますが
1 行になります。
よくある質問
YAML は JSON のスーパーセット? 実質的にはそうです。YAML 1.2 以降、正しい JSON はそのまま正しい YAML でもあるため、YAML パーサーは JSON を直接読めます。逆は成り立ちません——JSON は YAML のインデント構文を解釈できません。
API はどちらを返すべき? ほぼ常に JSON です——解析が速く、曖昧さがなく、どこでも対応。YAML は人が手で編集するファイル向けに。
変換後、コメントはどこへ? JSON にコメント構文がないため破棄されます。メモを残したいなら、代わりに "_comment" のような実キーを足します。フォーマット自体を深く知るには JSON とはをどうぞ。
ブラウザ内で安全に変換
JSON ⇄ YAML 変換ツールは両者を相互変換し、その場で構文をチェックします——問題があれば正確な位置を示します。すべてブラウザ内で動作するため、機微な設定も端末から出ません。
関連ツール
- JSON の整形・圧縮・検証には JSON 整形ツール。
- 表形式の JSON を表計算へ移すには JSON ⇄ CSV ⇄ Excel。