目次

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はインデントのずれで構造が変わり、暗黙の型変換(yestrue になるなど)も起きる。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という使い分けが現実的な基準になる。

免責事項 — 掲載情報は執筆時点のものです。料金・機能は変更される場合があります。最新情報は各公式サイトをご確認ください。