JSON か YAML か
要点:JSON は波括弧で区切り、YAML はインデントで区切ります。機械には JSON、設定を編集する人間には YAML。コメント、アンカー、複数文書の構造は変換で失われます。

要点:機械同士のデータには JSON、人間が編集する設定には YAML を使いましょう。コメント、複数行テキスト、アンカーが必要なら YAML を優先し、すべての言語が同じペイロードを曖昧さなくパースしなければならないなら JSON を優先します。
並べて比較
{
"server": {
"host": "127.0.0.1",
"port": 8080
}
}
server:
host: 127.0.0.1
port: 8080
同じ構造です。YAML は句読点を落とし、コメントの場所を得ます。
違い
| JSON | YAML | |
|---|---|---|
| 構造 | 波括弧とカンマ | インデント |
| コメント | なし | あり |
| 文字列 | 二重引用符、エスケープ必須 | 通常は裸 |
| 複数行テキスト | \n エスケープか配列 |
` |
| 再利用 | なし | アンカー & とエイリアス * |
| 複数文書 | 配列で包む | --- 区切り |
| パース速度 | 速い | 遅い。インデント規則 |
| 曖昧さ | 非常に低い | no が真偽値としてパースされ、インデントが一つずれる |
最後の行が YAML の本当のコストです。YAML 1.1 では country: NO が真偽値 false になり、version: 1.0 が浮動小数点になるかもしれません。JSON には暗黙の型付けがまったくありません。
選択
JSON:リクエストとレスポンスボディ、サービス間メッセージ、データベースの JSON 列、すべての言語で同一にパースされなければならないもの。
YAML:既定となっているエコシステム(Kubernetes、Ansible、GitHub Actions、Docker Compose)、説明が必要な設定、証明書、スクリプト、SQL のような長いテキストが支配的なファイル。
変換が失うもの
YAML → JSON:すべてのコメント、アンカーの再利用(重複に展開)、最初以外のすべての文書、日付と真偽値の元の綴り。
JSON → YAML:文字列と数値の区別が弱まるので、"8080" と 8080 はどちらも安全のため明示的な引用符が必要です。
移行や一度きりの検査のために変換します。同じファイルを二つの形式で並行ビューとして保守しないでください。
FAQ
JSON と YAML はどう決めればよいですか?
ファイルを誰が読み保守するかから始めます。プログラムが生成し、言語境界を越え、予測可能にパースされなければならないなら JSON。人間が編集し、フィールドの説明や長い複数行テキストが必要なら YAML。相互変換できますが、同じ設定を両形式で長期的に保守しないでください。
YAML がより多くの型の曖昧さを生むのはなぜですか?
YAML には暗黙の型付けがあり、NO、on、1.0 のような値が真偽値、日付、数値になりえます。JSON は明示的な型だけで、文字列は引用符が必要なので、言語をまたいだパースがより予測可能です。
YAML から JSON への変換でコメントとアンカーは残るべきですか?
いいえ。YAML のコメント、アンカー、複数文書は JSON で表現できず、アンカーは重複した内容に展開されます。保つ必要があるなら、オブジェクトの往復ではなく Document API を持つ YAML ライブラリを使ってください。