JSON と YAML: どちらの構成形式を使用する必要がありますか?
簡単な回答
APIs、データ交換、および厳密な解析と検証が重要な場合には、JSON を使用します。 YAML は、構成ファイル、DevOps マニフェスト、および人間の可読性とコメントが重要な場合に使用します。 YAML は JSON スーパーセットです。すべての有効な JSON ドキュメントは有効な YAML です。
導入
JSON と YAML はどちらも人間が判読できるデータ シリアル化形式です。 JSON は厳密かつ最小限であり、Web APIs では広く普及しています。 YAML は、コメント、複数行の文字列、アンカー、インデントベースの構造を追加する JSON のスーパーセットであり、構成ファイル (Docker Compose、Kubernetes、CI/CD パイプライン) でよく使用されています。
ステップバイステップ
-
構文と読みやすさを比較する
JSON では中かっこと引用符を使用します: {"key": "value"}。 YAML では、インデントとコロン: キー: 値が使用されます。 YAML は構成がよりクリーンです。文字列に引用符が必要なく、項目間のカンマや中括弧も必要ありません。 JSON は、データ交換においてより明示的でエラーが発生しにくくなります。
-
機能を比較する
YAML は、コメント (#)、複数行文字列 (|、>)、アンカー (&) およびエイリアス (*)、1 つのファイル内の複数のドキュメント (---)、複合型をサポートします。 JSON は、コメント、複数行の文字列、参照のいずれもサポートしません。 JSON の単純さは意図的なものです。これは構成言語ではなく、データ交換形式です。
-
安全性と解析を比較する
JSON 解析は高速かつ安全です。JSON.parse はすべての JavaScript エンジンに組み込まれています。 YAML 解析は遅く、より複雑です。YAML 仕様は 80 ページ以上ですが、JSON の 2 ページです。 YAML には、JSON にはないセキュリティ リスク (アンカーを介した億単位の笑い攻撃) があります。アンカーを無効にする安全な YAML パーサーを常に使用してください。
-
エコシステムの使用状況を比較する
JSON: REST APIs、package.json、tsconfig.json、NoSQL データベース、Web アプリ。 YAML: Docker Compose、Kubernetes マニフェスト、GitHub Actions、Ansible Playbook、CI/CD 構成、OpenAPI 仕様。 JSON は実行時データの大半を占めます。 YAML が構成を支配します。
-
ユースケースに基づいて決定してください
APIs、データ交換、NoSQL、Web アプリの状態: JSON。構成ファイル、DevOps、CI/CD、コードとしてのインフラストラクチャ: YAML。人間が手書きする場合: YAML。マシンがそれを生成および消費する場合: JSON。
例
JSON と YAML で同じ構成
入力: JSON: {"server": {"port": 8080, "host": "localhost"}}
YAML: server:\n port: 8080\n host: localhost
出力: YAML は 30% 短く、コメントをサポートします。 JSON はより厳密であり、普遍的に解析可能です。
よくある問題
- YAML インデント エラー: YAML は構造にインデントを使用しており、スペースが 1 つ間違っていると解析が中断されます。YAML lint 機能を備えたエディタを使用し、常にスペースを使用し、タブは使用しないでください。
- YAML 十億笑い攻撃: YAML アンカーとエイリアスは指数関数的な拡張を引き起こし、DoS を引き起こす可能性があります。アンカーを無効にする安全な YAML パーサー (Python の yaml.safe_load など) を使用してください。
- JSON にはコメントがありません: JSON 仕様ではコメントが禁止されているため、構成ファイルに注釈を付けるのが難しくなります。人間が編集した構成には YAML を使用し、機械で生成されたデータには JSON を使用します。
- YAML の暗黙的型付けには驚きがあります。YAML は、yes/no をブール値に、1.0 を浮動小数点数に自動変換します。これにより、文字列フィールドが壊れる可能性があります。予期しない型強制を避けるために、文字列を明示的に引用符で囲みます。
ヒント
- 人間が作成した構成 (Docker Compose、Kubernetes、CI/CD) には YAML を使用し、機械生成のデータ交換 (APIs、NoSQL、アプリの状態) には JSON を使用します。
- アンカーとエイリアスを無効にする安全な YAML パーサーを常に使用してください。信頼できない入力には汎用の YAML ローダーを決して使用しないでください。
- YAML を JSON に変換すると、コメント、複数行の文字列、アンカーが失われることが予想されます。JSON は YAML のサブセットであり、機能の場合はその逆ではありません。
- YAML を一貫して 2 つのスペースでインデントします。タブとスペースの混合、または一貫性のないインデントの使用は、最も一般的な YAML 解析エラーです。