JSON vs YAML 完全比較ガイド
開発者であれば、JSONとYAMLは日常的に使うフォーマットです。Docker ComposeはYAMLを使い、APIレスポンスはJSONを使います。それぞれのメリット・デメリットは何か、そしてどちらを選ぶべきか——このガイドで詳しく比較します。
構文の比較
同じデータをJSONとYAMLの両方で表現してみましょう。
JSON
{"server": {"host": "localhost","port": 8080,"debug": true,"databases": ["postgres", "redis"],"cors": {"origins": ["https://example.com"],"credentials": true}}}
YAML
server:host: localhostport: 8080debug: truedatabases:- postgres- rediscors:origins:- https://example.comcredentials: true
主な違い
| 特徴 | JSON | YAML |
|---|---|---|
| 可読性 | 良好 | 優秀 |
| コメント | 非対応 |
|
| ファイルサイズ | 大きめ(括弧・クォートのため) | 小さめ |
| パース速度 | 高速 | やや低速 |
| データ型 | 6種類 | より多い(日付・バイナリなど) |
| インデント | 構造に影響しない | 構造を定義する |
| 標準規格 | RFC 8259 | YAML 1.2 |
JSONのメリット
1. 幅広い互換性
ほぼすべてのプログラミング言語にJSONパーサーが組み込まれています。ブラウザでは JSON.parse() と JSON.stringify() が追加ライブラリなしでネイティブに使えます。
2. パフォーマンス
シンプルな文法のおかげでパースが高速です。大規模なデータセットを処理する場面で有利です。
3. 厳格な構文
厳密な構文仕様により、パースエラーを検出しやすくなっています。曖昧な解釈の余地がありません。
4. APIの標準フォーマット
ほとんどのWeb API(REST、GraphQL)がデフォルトのフォーマットとしてJSONを採用しています。
YAMLのメリット
1. 可読性
インデントベースの構造は、人間にとって非常に読みやすいです。特に設定ファイルに向いています。
2. コメントのサポート
# 記号を使ってコメントを書けるため、設定ファイルに説明を追加できます。
# データベース設定database:host: localhost # 開発環境用port: 5432
3. 複数行文字列
長いテキストをきれいに記述できます。
description: |これは複数行にわたる長い説明文です。改行がそのまま保持されます。
4. アンカーとエイリアス
参照を使って繰り返し出てくる値を再利用できます。
defaults: &defaultstimeout: 30retries: 3development:<<: *defaultsdebug: trueproduction:<<: *defaultsdebug: false
どちらを選ぶべきか?
JSONを選ぶケース
- API通信: クライアントとサーバー間のデータ交換
- ブラウザ環境: WebフロントエンドでのJSONデータ処理
- プログラムが生成・消費するデータ: コードが直接扱うデータ
- パフォーマンスが重要な場面: 大規模なデータセットの高速パース
YAMLを選ぶケース
- 設定ファイル: Docker Compose、Kubernetes、GitHub Actions
- 人が手書きするファイル: コメントと可読性が重要な場合
- CI/CDパイプライン: ワークフローの定義
- ドキュメント付き設定: 各オプションに説明が必要な場合
YAMLの落とし穴
インデントエラー
YAMLで最もよくある間違いです。必ずスペースを使い、タブは絶対に使わないでください。
暗黙の型変換
YAMLは yes、no、on、off を自動的に真偽値に変換します。文字列として扱いたい場合はクォートで囲んでください。
# 注意: country が真偽値の true になってしまうcountry: NO# 正しい書き方country: "NO"
セキュリティ上の懸念
YAMLの実装によっては、任意コード実行の脆弱性が存在する場合があります。信頼できないYAML入力を処理する際は、必ずセーフローダーを使用してください。
まとめ
JSONとYAMLは競合するフォーマットではなく、互いを補い合うものです。用途に合わせて適切に選択し、必要なときはJSONKitのConvertツールを使って両フォーマット間を即座に変換しましょう。