JSON と YAML は同じ問題 —— 構造化データをテキストで表現する —— を解決しますが、トレードオフは正反対です。JSON は機械にとって曖昧さのないパースを最適化し、YAML は人間が書くことを最適化します。YAML 1.2 以降、すべての妥当な JSON ドキュメントは妥当な YAML でもあります。本ガイドでは両者の構文、型、機能を比較し、それぞれをいつ使うかを説明します。
短い答え
プログラム間で交換するデータには JSON —— API レスポンス、メッセージペイロード、機械が生成するもの一般。人間が手で書いて編集するファイルには YAML —— CI パイプライン、Kubernetes マニフェスト、アプリ設定 —— コメントと可読性が重要な場面で。
並べて見る構文
同じデータを両方のフォーマットで:
# YAML
service: api
replicas: 3
ports:
- 8080
- 8443
env:
LOG_LEVEL: info
DEBUG: false// JSON
{
"service": "api",
"replicas": 3,
"ports": [8080, 8443],
"env": {
"LOG_LEVEL": "info",
"DEBUG": false
}
}YAML は中括弧や角括弧の代わりにインデントを使い、ほとんどの引用符を省き、コメントを許容します。JSON はもっと冗長ですが、意味のあるホワイトスペースがなく、信頼できる形でのパースと生成がはるかに容易です。
YAML は JSON の上位集合
YAML 1.2(2009)以降、YAML は JSON の厳密な上位集合です —— 任意の妥当な JSON ドキュメントは妥当な YAML です。YAML が JSON の「flow」構文を直接採用したためです。JSON を YAML ファイルに貼り付けてもそのまま動くのはこのためです。背景については YAML 1.2 と JSON 互換性 を参照。
# これは妥当な YAML —— 同時に妥当な JSON でもある
{"service": "api", "replicas": 3}機能比較
| 機能 | JSON | YAML |
|---|---|---|
| コメント | なし | あり(#) |
| 末尾カンマ | 不可 | 該当なし(block スタイルにはカンマがない) |
| 複数行文字列 | エスケープ \n のみ | ネイティブ(| と >) |
| アンカー / 参照 | なし | あり(& / *) |
| ファイルあたり複数ドキュメント | 不可 | 可(--- 区切り) |
| 有意義なホワイトスペース | なし | あり(インデントが意味を持つ) |
| パース複雑度 | 些細 | 複雑 |
| 最適用途 | 機械間のデータ交換 | 人間が編集する設定 |
型の扱い:YAML の鋭利な角
YAML は型推論に積極的で、JSON の明示的な引用符が避けるサプライズを引き起こします:
# 「Norway problem」 —— YAML 1.1 パーサではこれらが真偽値になる
countries:
- NO # → false (!)
- SE
- true # → 真偽値、文字列 "true" ではない
version: 1.20 # → 数値 1.2、末尾のゼロが失われる
zip: 01234 # → 668(一部パーサで八進数として解釈) JSON にはこの曖昧さが一切ありません:"NO" は常に文字列 NO ですし、"01234" は常にその文字列です。YAML の値が必ず文字列であるべきときは、明示的に引用符を付けましょう。
TOML と JSON5 の位置づけ
「人に優しい」設定フォーマットとしてよく一緒に挙がる他の 2 つ:
- TOML —— section/key 形式、手書きのアプリ設定向け(Cargo、Poetry、Hugo)。YAML より厳密で、意味のあるインデントなし、ネイティブで型付きの値(datetime、整数、float、配列、インラインテーブル)。データがほぼ平坦なテーブルのときに最適。
- JSON5 —— 開発者向けに緩めた JSON:コメント、末尾カンマ、引用符なしキー、シングルクォート、複数行文字列を許容。標準 JSON パーサが受理する わけではなく、JSON5 ライブラリを使ってオプトインします(または「コメント + 末尾カンマ」サブセット用に JSONC パーサ、例:
tsconfig.json)。
ざっくり目安:機械間交換は JSON、深くネストする人手編集の設定は YAML、平坦なアプリ/ツール設定は TOML、エディタ設定で YAML のホワイトスペース規則を採用せずに JSON にコメントが欲しいときは JSON5/JSONC。
どちらをいつ使うか
- JSON を使う:REST/GraphQL API、メッセージキュー、ブラウザの
localStorage、package.json、コードで生成または消費されるもの全般。 - YAML を使う:GitHub Actions / GitLab CI、Kubernetes と Docker Compose、Ansible playbook、人間が編集してコメントを付けたいアプリ設定。
よくあるパターン:可読性のために設定を YAML で書き、ビルドかロード時に JSON に変換して、アプリケーションは常に JSON だけをパースする。
JSON と YAML を相互変換
# Python —— YAML から JSON
import yaml, json
data = yaml.safe_load(open('config.yaml'))
print(json.dumps(data, indent=2))
# yq を使ったコマンドライン
yq -o=json '.' config.yaml # YAML → JSON
yq -P '.' config.json # JSON → YAMLもしくは fixjson の YAML ⇄ JSON コンバータ でブラウザ上で即変換 —— YAML を貼って JSON を得る(または逆方向)、データはどのサーバにも送信されません。
よくある質問
YAML は JSON より良いですか?
「良い」というものはなく、それぞれ違う仕事に合わせて調整されています。人手編集の設定には YAML が良く(コメント、可読性)、機械間データ交換には JSON が良い(シンプル、高速、曖昧さのないパース)。
JSON は妥当な YAML ですか?
はい。YAML 1.2 以降、YAML は JSON の厳密な上位集合なので、任意の妥当な JSON ドキュメントは妥当な YAML です。逆は成立しません —— 多くの YAML は妥当な JSON ではありません。
なぜ YAML は「NO」を false にするのですか?
YAML は引用符のないスカラから型を推論し、一部パーサは NO、yes、on、off を真偽値として読みます(「Norway problem」)。値を引用符で囲めば("NO")強制的に文字列にできます。JSON は必須の引用符でこれを完全に回避します。
設定ファイルには YAML と JSON のどちらを使うべき?
人間が編集し、コメントと複数行文字列の恩恵があるなら YAML、ツールが生成または消費するなら JSON。多くのチームは YAML で書き、ロード時に JSON に変換します。
ブラウザで変換 & 検証
- YAML ⇄ JSON コンバータ —— 両方向変換、クライアントサイド
- YAML フォーマッタ —— YAML をフォーマット、再インデント、検証
- JSON とは? —— YAML が上位集合となっているフォーマット
- JSON のフォーマット方法 —— 変換結果を pretty-print
- YAML 1.2 と JSON 互換性 —— YAML がいかに JSON の上位集合になったか