目次
JSONとYAMLは、どちらもデータをテキストで表現するシリアライゼーション形式だ。プログラミング言語や環境をまたいでデータを交換したり、設定ファイルを記述したりする場面で広く使われる。見た目は異なるが表現できるデータ構造はほぼ同じであり、YAMLはJSONのスーパーセット(JSONはYAMLの部分集合)だ。
JSONの特徴
JSON(JavaScript Object Notation)は2001年にDouglas Crockfordが普及させた形式だ。JavaScriptのオブジェクト構文に基づいており、すべての主要プログラミング言語でパーサーが提供されている。
{
"name": "Alice",
"age": 30,
"skills": ["Python", "TypeScript"],
"address": {
"city": "Tokyo",
"zip": "100-0001"
}
}
JSONのルール:
- 文字列は必ずダブルクォートで囲む
- 末尾カンマは禁止(最後の要素にカンマをつけるとエラー)
- コメントは書けない
- 値の型は文字列・数値・真偽値・null・配列・オブジェクトのみ
YAMLの特徴
YAML(YAML Ain’t Markup Language)は人間が読み書きしやすいことを優先した形式だ。
name: Alice
age: 30
skills:
- Python
- TypeScript
address:
city: Tokyo
zip: "100-0001" # 数字のみの場合は引用符推奨
YAMLの特徴:
- インデントで階層を表現(タブは使用不可、スペースのみ)
#でコメントを書ける- 文字列にクォートが不要(ほとんどの場合)
- 複数ドキュメントを
---で区切れる - アンカー(
&)とエイリアス(*)で値を再利用できる
使い分けの判断基準
| 用途 | 推奨形式 | 理由 |
|---|---|---|
| Web API レスポンス | JSON | 全言語対応、パースが高速 |
| 設定ファイル(Docker, CI/CD) | YAML | コメント可能、可読性高 |
| LLM出力の構造化データ | JSON | パースが厳格で信頼性高 |
| Kubernetes マニフェスト | YAML | 公式フォーマット |
| データベースのデータ保存 | JSON | 多くのDBがJSONBをサポート |
LLMとJSON出力
LLMにJSON形式で出力させる場合、YAMLよりJSONが適している。理由はパース時の厳格さだ。YAMLはインデントのずれで構造が変わり、暗黙の型変換(yes が true になるなど)も起きる。JSONはより厳格な構文のため、パースエラーが予測しやすい。
多くのLLM APIはJSONモード(Structured Output)を提供しており、スキーマを指定すると常にそのスキーマに沿ったJSONを返す。Pydanticのモデル定義からJSONスキーマを自動生成してLLMに渡すパターンが普及している。
YAMLのよくある落とし穴
YAMLは柔軟すぎるがゆえに予期しない挙動を起こしやすい。
# 意図せずbooleanになる値
debug: yes # true として解釈される
port: on # true として解釈される(YAML 1.1)
country: NO # false として解釈される(YAML 1.1)
# 先頭ゼロの数値
version: 010 # 8進数として解釈される場合がある
これらは「Norway Problem」として知られ、YAML 1.2以降では修正されているが、古いパーサーでは注意が必要だ。設定値が数字のみの場合や yes/no/on/off/true/false を文字列として扱いたい場合は、明示的にクォートで囲む。
まとめ
JSONはAPIとデータ交換の標準であり、厳格な構文と全言語サポートが強みだ。YAMLはコメント・アンカー・省略構文により設定ファイルの可読性が高いが、暗黙の型変換という落とし穴がある。LLMの出力をプログラムで処理する場合はJSONが適しており、JSONモード(Structured Output)の活用が信頼性向上に有効だ。設定ファイルにはYAML、データ交換にはJSONという使い分けが現実的な基準になる。
免責事項 — 掲載情報は執筆時点のものです。料金・機能は変更される場合があります。最新情報は各公式サイトをご確認ください。