ブログ

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: localhost
port: 8080
debug: true
databases:
- postgres
- redis
cors:
origins:
- https://example.com
credentials: true

主な違い

特徴JSONYAML
可読性良好優秀
コメント非対応

# コメント

ファイルサイズ大きめ(括弧・クォートのため)小さめ
パース速度高速やや低速
データ型6種類より多い(日付・バイナリなど)
インデント構造に影響しない構造を定義する
標準規格RFC 8259YAML 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: &defaults
timeout: 30
retries: 3
development:
<<: *defaults
debug: true
production:
<<: *defaults
debug: false

どちらを選ぶべきか?

JSONを選ぶケース

  • API通信: クライアントとサーバー間のデータ交換
  • ブラウザ環境: WebフロントエンドでのJSONデータ処理
  • プログラムが生成・消費するデータ: コードが直接扱うデータ
  • パフォーマンスが重要な場面: 大規模なデータセットの高速パース

YAMLを選ぶケース

  • 設定ファイル: Docker Compose、Kubernetes、GitHub Actions
  • 人が手書きするファイル: コメントと可読性が重要な場合
  • CI/CDパイプライン: ワークフローの定義
  • ドキュメント付き設定: 各オプションに説明が必要な場合

YAMLの落とし穴

インデントエラー

YAMLで最もよくある間違いです。必ずスペースを使い、タブは絶対に使わないでください。

暗黙の型変換

YAMLは yesnoonoff を自動的に真偽値に変換します。文字列として扱いたい場合はクォートで囲んでください。

# 注意: country が真偽値の true になってしまう
country: NO
# 正しい書き方
country: "NO"

セキュリティ上の懸念

YAMLの実装によっては、任意コード実行の脆弱性が存在する場合があります。信頼できないYAML入力を処理する際は、必ずセーフローダーを使用してください。

まとめ

JSONとYAMLは競合するフォーマットではなく、互いを補い合うものです。用途に合わせて適切に選択し、必要なときはJSONKitのConvertツールを使って両フォーマット間を即座に変換しましょう。