ガイド記事 · 6 分で読む
YAML vs JSON: いつどちらを使用するか
YAML と JSON は、ネストされたキーと値のペアとリストという同じ基本的な考え方に基づいて構築された 2 つのシリアル化形式の間の選択です。実際に重要な違いは、ファイルを誰が読み取るか、つまり人間かマシンかということです。
更新されました
YAML vs JSON: ショートバージョン
JSON はデータ交換形式です。厳密で曖昧さがなく、すべての言語でネイティブに解析できます。 YAML は設定形式です。コメントと複数行の文字列を受け入れ、プル リクエストでユーザーが編集できるように設計されています。 JSON は回線上で使用し、YAML は人間が管理するファイル内で使用し、境界で必要な場合はそれらの間で変換します。
実際に何が違うのか
コメント
YAML にはコメントがあります。 JSON はそうではありません。構成ファイルでは、これは決定的です。通常、タイムアウトが 3000 に設定されている理由は、その上のコメントによってわかります。 YAML を JSON に変換するとコメントが削除されるため、JSON は真実のソースではなくビルド アーティファクトとして扱われることがよくあります。
構文とノイズ
# YAML
service:
name: checkout
replicas: 3
ports: [8080, 9090]
// JSON — same data
{
"service": {
"name": "checkout",
"replicas": 3,
"ports": [8080, 9090]
}
}
YAML は、インデントの感度と引き換えに中括弧、引用符、カンマを削除します。これは、すべての YAML ユーザーが知っているトレードです。文字数が減れば、空白を微妙に間違える方法が増えます。
種類と罠
- JSON には 1 つの数値型があります。 YAML は int、float などを区別し、YAML 1.1 は国コード NO をブール値 false として解析し、1.10 は引用符で囲まれない限り末尾のゼロが失われる数値として解析することで有名です。
- YAML は、再利用のためのアンカーとエイリアス (&defaults / *defaults) をサポートします。 JSON には同等のものがないため、共有ブロックを複製するか生成する必要があります。
- YAML は複数のドキュメント ファイル (--- 区切り文字) をサポートします。 JSON はファイルごとに 1 つのドキュメントです。通常、コンバータはドキュメントを配列に変換します。
- JSON には二重引用符で囲まれたキーと文字列が必要です。 YAML は必要な場合にのみ引用符を付けます。つまり、不注意な文字列が黙って数値またはブール値になる可能性があります。
各フォーマットが勝てる場所
- API とワイヤ形式: JSON。ユニバーサルパーサー、予測可能な曖昧さ、ストリーミングフレンドリー (JSON 行)。
- Kubernetes、CI/CD、Docker Compose、Ansible、Helm: YAML。これらのエコシステムはそれに基づいて標準化されており、コメントをサポートしているためです。
- プログラムで生成するベンダー構成: JSON — アルゴリズムにより、インデントを心配することなく生成されます。
- ジュニアチームメイトが手動で編集するドキュメント: YAML、理由を説明するコメント付き。
安全に変換する
- 複数のドキュメント ファイルを把握します。 --- で区切られた k8s マニフェスト セットは、最初のドキュメントだけでなく、JSON 配列になる必要があります。見つかったドキュメントの数を報告するコンバーターを使用します。
- 識別子である数字を引用符で囲みます。 「1.10」はバージョンです。 1.10 は浮動小数点数です。値が数値に見える文字列の場合、YAML に変換するときに強制引用符を有効にします。
- コメントが消えていくのを見てください。 JSON への変換は、定義上、損失を伴います。コメントが重要な場合は、YAML をソースとして保持し、ビルド時にのみ JSON を生成します。
- 正確なエラーを検証します。一部のツールでは、インデント エラーにより誤解を招くメッセージが生成されます。行と列が表示されていることを確認してください。
試してみてください。任意の YAML を YAML から JSON へのコンバータに貼り付けます。複数ドキュメントのサポートと正確なエラー行が組み込まれており、何もアップロードされません。
よくある質問
YAML は JSON のスーパーセットですか?
YAML 1.2 はスーパーセットとして設計されています。有効な JSON は通常、有効な YAML です。ただし、YAML 1.1 (まだリリース中) では、いくつかのエッジ ケースが異なり、タブ、重複キー、および特定の文字列の解析方法がエンジン間で異なります。 「技術的に有効です YAML」は、移行戦略ではなく、面白い事実として扱います。
どちらの方が解析が早いでしょうか?
JSON パーサーは文法が小さいため、一般に高速かつ単純です。ネイティブ JSON 解析はすべてのランタイムに存在します。構成ファイルの場合、違いは無関係です。起動時に 1 回解析されます。