メインコンテンツへスキップ

← ブログ一覧へ

JSON と YAML の違いと、相互変換の方法

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 では引用符なしの noyesonoff が真偽値になり、国コード NOfalse になり得ます。真偽値に見える文字列は引用符で囲みましょう。
  • アンカーは展開される。 YAML の &anchor/*ref による再利用は、JSON 変換時にフラットな普通のデータに展開されます。

機能の比較

機能JSONYAML
コメントなしあり(#)
末尾カンマ不可該当なし
人間の読みやすさ良い深い入れ子で有利
解析速度速い遅い
複数行文字列エスケープ \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 変換ツールは両者を相互変換し、その場で構文をチェックします——問題があれば正確な位置を示します。すべてブラウザ内で動作するため、機微な設定も端末から出ません。

関連ツール