JSON/YAML/TOML 設定フォーマット比較:開発者向け選択ガイド
本記事では、主流の3つの設定フォーマットについて設計、構文、エコシステムを比較し、新規プロジェクトに適した設定ファイルフォーマットの選択を支援します。
2026-08-19 更新
3つのフォーマットのコア設計思想
JSONはJavaScript由来の軽量なクロスプラットフォーム・データ交換フォーマットとして設計されました。構文規則はECMAScript規格に準拠しており、機械によるパースの信頼性が優先されています。RFC 8259では、システム間で構造化データを伝送することが核心的な目的として明記されています。
YAML(正式名称はYAML Ain't Markup Language)は人間が読みやすい設定データとして位置付けられています。手動編集の障壁を下げることを優先し、インデントによる階層構造で階層の記述を単純化しており、非技術者が設定を編集する必要があるシナリオに適しています。
TOML(正式名称はTom's Obvious, Minimal Language)は、意味が明確な設定フォーマットとして設計されました。設定の意味は曖昧なくパース可能であるべきという考えを提唱し、明示的なセクション分割とキーバリュー構造によって解釈の曖昧さを回避しています。
コア構文機能の比較
3つのフォーマットの一般的な機能の違いは、設定の記述体験に直接影響します。JSONはコメント用の領域を予約しておらず、大半のパーサーはコメント構文をサポートしていません。YAMLとTOMLはいずれも単一行コメントと複数行コメントをネイティブでサポートしているため、設定の説明を記述する際に便利です。
複数行文字列と日時型の違いは、シナリオごとの要件に対応しています。YAMLは複数行の説明やテンプレート内容を記述するのに適している一方、JSONでは改行にエスケープ処理が必要で、互換性は一貫しているものの記述が煩雑です。
| 構文機能 | JSON | YAML | TOML |
|---|---|---|---|
| ネイティブなコメントサポート | なし | あり | あり |
| ネイティブな複数行文字列 | なし | あり、2つのスタイル | あり、3つのスタイル |
| ネイティブな日時型 | なし、文字列のみ対応 | あり、ISO 8601形式 | なし、文字列のみ対応 |
| 構文の依存関係 | 波括弧と角括弧で区切られる | インデントに依存する | セクション記号で区切られる |
よくあるパースの曖昧さに関する古典的な問題
JSONで最も広く知られた問題は、公式にコメントがサポートされていないことです。開発者がJSONにコメントを追加すると、標準パーサーに切り替えた際にパース失敗が直接発生し、設定を読み込めなくなります。JSONCなどの派生ソリューションではコメントのサポートが追加されていますが、公式規格に取り込まれていません。
YAMLには有名なノルウェー問題が存在します。文字列が`20:03`の形式のとき、一部のパーサーが自動的にBase60の時刻型に変換してしまい、値が`1203`になり、期待される文字列値と一致しなくなる問題です。この問題はYAMLの暗黙的型変換ルールに起因しています。
TOMLには暗黙的型変換が存在しません。すべての値の型は構文によって明示的にマークされ、型が自動的に推論されることはありません。そのため、同様の曖昧さの問題が発生せず、型の結果は記述者の期待と一致します。
主流開発エコシステムでの採用状況
異なる技術スタックにおける3つのフォーマットの採用度には明確な階層が存在します。次の表は、アプリケーションシナリオごとの各フォーマットの主流な状況と、対応するエコシステムにおけるパーサーの成熟度をまとめたものです。
- Docker ComposeはYAMLを設定フォーマットとして使用し、複数サービスの宣言と階層設定に対応しています
- npmエコシステムのpackage.jsonはJSONを使用してプロジェクトメタデータと依存関係設定を保存しており、Node.jsプロジェクトの標準です
- PythonのPEP 621はpyproject.tomlをPythonプロジェクトの設定標準として定めており、古いsetup.pyによる設定を置き換えています
- GitHub Actionsのワークフロー設定はYAML形式を使用しており、クラウドネイティブ分野の大半のツールがYAMLを使用しています
フォーマット相互変換における情報保持の境界
異なるフォーマット間で変換を行う場合、情報損失が発生する境界が決まっています。OKfmtのフォーマット変換ツールは、構文のサポート状況に基づいて有効な情報を保持し、非互換の内容を破棄します。JSONからYAMLまたはTOMLに変換する場合、ネイティブな情報の損失は発生せず、すべての構造を完全にマッピングできます。
YAMLからJSONに変換する場合、JSONがこれら2つの機能をサポートしていないため、YAMLのコメントとネイティブな日時型の情報が失われます。TOMLからJSONに変換する場合、失われるのはコメントのみで、すべての構造型を完全にマッピングできます。YAMLからTOMLに変換する場合、ネイティブな日時型は対応する形式の文字列に変換され、コメントは完全に保持されます。
よくある質問
新規プロジェクトの設定にはどのフォーマットを選択すべきですか
エコシステムの要件に応じて選択できます。Node.jsプロジェクトは既定でJSON、クラウドネイティブな設定は既定でYAML、Pythonプロジェクトは既定でTOMLを使用し、カスタムプロジェクトの場合はチームの習慣に応じて選択してください。
JSONがコメントをサポートしていない問題を解決するにはどうすればよいですか
JSONC形式で記述し、ビルド後に標準JSONに変換するか、説明情報を専用の説明フィールドに配置する方法があります。具体的なソリューションはプロジェクトが使用するパーサーに依存します。
YAMLのインデントの問題によるパースエラーを回避するにはどうすればよいですか
2スペースのインデントに統一し、エディターのタブ置き換えを無効にしてください。一部のエディタープラグインはインデントをリアルタイムでチェックでき、JSONに変換してから構造の妥当性を検証することもできます。