JSON vs YAML 比較

設定ファイルやデータファイルにおけるJSONとYAMLを比較します。可読性、機能、注意すべき落とし穴、プロジェクトに適した形式の選び方を解説します。

Concept

詳細な説明

JSONとYAMLはどちらも人間が読めるデータシリアライズ形式ですが、少し異なるニッチに対応しています。JSONはシンプルさと曖昧さのないパースを優先し、YAMLは人間の可読性と表現力を優先します。どちらも同じデータ構造を表現できますが、構文と機能は大きく異なります。

構文の比較:

JSON:

{
  "server": {
    "host": "localhost",
    "port": 8080,
    "debug": true,
    "allowed_origins": ["example.com", "api.example.com"]
  }
}

YAML:

server:
  host: localhost
  port: 8080
  debug: true
  allowed_origins:
    - example.com
    - api.example.com

YAMLは波括弧や角括弧の代わりにインデントを使用し、ほとんどの文字列でクォートを省略し、arrayの要素に - を使用します。これにより視覚的にクリーンで手書きが容易になります。

JSONにないYAMLの主要機能:

  • コメント: YAMLは任意の行に # コメントをサポート
  • 複数行文字列: YAMLは |(リテラルブロック)と >(フォールドブロック)で複数行テキストを提供
  • アンカーとエイリアス: YAMLは &anchor*alias で値を参照・再利用可能
  • 複数ドキュメント: 単一のYAMLファイルに --- で区切られた複数のドキュメントを含められる
  • カスタム型: YAMLは !!timestamp などのタグ付き型やカスタム型ハンドラをサポート

YAMLの有名な落とし穴:

YAMLの柔軟性は周知の問題を生みます。値 no は文字列 "no" ではなくboolean false としてパースされます。文字列 3.14.159 は文字列としてパースされますが、3.14 はfloatです。国コード NO(ノルウェー)は false になります。バージョン文字列 1.0 は数値 1.0 になり、末尾のゼロが失われます。これらの暗黙の型変換は本番インシデントを引き起こしており、多くの開発者が経験した有名な「ノルウェー問題」が含まれます。YAML 1.2仕様ではこれらのルールが厳格化されましたが、多くのパーサーはまだYAML 1.1の動作を使用しています。

開発者がよくやるミス:

最も危険なミスは、文字列のままであるべき値をクォートせずにYAMLの暗黙の型変換を信頼することです。バージョン番号、国コード、型が重要な値は常にクォートしてください。もうひとつのミスは一貫性のないインデントです。YAMLはホワイトスペースに敏感で、タブとスペースを混在させるとパースエラーが発生します。また、YAMLの複雑さを過小評価する開発者もいます。完全なYAML仕様はJSONよりも大幅に複雑で、パーサー実装間の非一貫性につながっています。

ベストプラクティス:

人間の可読性とコメントが有益な設定ファイル(Kubernetesマニフェスト、Docker Compose、CI/CDパイプライン)にはYAMLを使用してください。データ交換、API、マシン生成ファイルにはJSONを使用してください。すべての有効なJSONドキュメントは有効なYAMLでもあるため(YAMLはJSONのスーパーセット)、JSONから始めて可読性が優先される場合にYAML構文に切り替えることができます。YAMLを使用する際は、数値やbooleanとして誤解される可能性のある文字列を常にクォートしてください。

ユースケース

Kubernetesデプロイメントマニフェストには設定の選択理由を説明するコメントが必要なためYAMLを選択し、デプロイメントデータの読み書きを行うAPIにはJSONを使用する。

試してみる — JSON Formatter

フルツールを開く