先に要点
- JSON mode は「JSONとして壊れていない文字列を返させる」機能です。
- Structured Outputs は、それに加えて 指定した schema に従わせる 機能です。
- つまり違いの本質は、JSONが返るか ではなく、欲しい shape が保証されるか にあります。
- OpenAI公式も、可能なら JSON mode より Structured Outputs を使うことを推奨しています。
OpenAI の API を使っていると、JSON で返してください と書くだけで済ませたくなる場面があります。
でも実務で困るのは、JSON っぽい かどうかではなく、必要なキーが揃っているか、型が合っているか、enum が壊れていないか です。
そこで出てくるのが Structured Outputs です。
この記事では、2026年4月25日時点の OpenAI Developers 公式ドキュメントをもとに、
- Structured Outputs とは何か
- JSON mode と何が違うのか
- function calling と何がどう関係するのか
- Responses API と Chat Completions API でどう指定が違うのか
を、実務で混ざりやすい順に整理します。
Structured Outputsとは
OpenAI公式の定義では、Structured Outputs は
モデルが supplied JSON Schema に従う応答を常に生成するようにする機能
です。
言い換えると、JSON で返して というお願いではなく、
- このキーが必要
- この型である
- この enum だけ許可
- 余計なキーは禁止
のような条件まで、APIレベルで明示する仕組みです。
これにより、
- required key が抜ける
- string のはずが number になる
- enum にない値が出る
- 余計なプロパティが混ざる
といった事故を減らしやすくなります。
JSON modeとは何か
一方の JSON mode は、もっと素朴です。
OpenAI公式は、JSON mode を Structured Outputs の more basic version と説明しています。
つまり JSON mode が保証するのは、基本的に
- 返り値が valid JSON であること
までです。
逆に言うと、JSON mode では
- schema に合うか
- 欲しい key が全部あるか
- 型が期待通りか
は保証されません。
ここが、Structured Outputs との決定的な差です。
違いをひとことで言うと
一番大事なので、ここだけは先に固定した方がいいです。
| 観点 | JSON mode | Structured Outputs |
|---|---|---|
| JSONとして壊れていない | 保証する | 保証する |
| schemaに従う | 保証しない | 保証する |
| required key の欠落を防ぎやすい | 弱い | 強い |
| enum や型のズレを防ぎやすい | 弱い | 強い |
| OpenAIの推奨 | 旧来の基本機能 | 可能ならこちら |
つまり、
- JSON mode =
壊れていない JSON - Structured Outputs =
schema に従った JSON
です。
JSON が返るなら同じでは と思いがちですが、実務ではかなり差があります。
なぜ JSON mode だけでは足りないのか
例えば、欲しいレスポンスが
{
"name": "Jane",
"age": 54
}
だったとします。
JSON mode なら、次のような返り方でも technically valid JSON です。
ageが"54"という文字列nameが抜けているextra_noteが勝手に増えるageが-1になる
JSON としては壊れていなくても、アプリ側では困ります。
だから OpenAI も、JSON mode では schema adherence は保証されない と明言し、可能なら Structured Outputs を使うように勧めています。
Structured Outputs の利点
OpenAI公式が挙げている利点は主に3つです。
1. type-safe に近づけやすい
アプリ側で
- パース後に if 文だらけで補正する
- schema 不一致ならリトライする
- キー欠落を手動で埋める
といった後処理を減らしやすくなります。
もちろん完全にミスがゼロになるわけではありません。
OpenAI自身も Structured Outputs can still contain mistakes とは書いています。
それでも、素の JSON mode より後工程がかなり楽 なのは大きいです。
2. refusal を明示的に扱いやすい
Structured Outputs では、モデルが安全上の理由で拒否したとき、refusal フィールドで検出しやすくなっています。
これは地味ですが実務で効きます。
JSON schema に合わない変な文字列が返ってきて、壊れたのか拒否なのか分からない という状態を減らせるからです。
3. プロンプトを短くしやすい
必ずこのキーで返して
余計な説明は書かないで
JSONだけ返して
のような強い指示をプロンプトに何重にも書く必要が減ります。
最近の GPT-5.5移行記事 でも触れた通り、OpenAIは schema はできるだけプロンプトから外し、Structured Outputs に寄せる 方を推しています。
function calling と何が違うのか
ここはかなり混ざりやすいです。
OpenAI公式では、Structured Outputs は2つの形で使えると整理されています。
- function calling の中で使う
- モデルの返答そのものを schema 化する
違いは、その JSON がどこに向いているか です。
function calling の中で使う場合
これは、モデルがツールを呼ぶときの引数を schema に沿わせたいケースです。
たとえば
get_weather(location, units)search_docs(query)create_invoice(customer_id, amount)
のような関数に、正しい引数を渡させたいときです。
この場合は、tool parameters の schema を厳密にする方が中心です。
モデルの返答そのものを schema 化する場合
こちらは、ユーザーに返す本文を構造化したいケースです。
たとえば、
- 要約結果
- 抽出データ
- UI に流し込む JSON
のような出力を、そのまま schema に従わせたいときです。
OpenAI公式は、ユーザーへの返答そのものを構造化したいなら structured text.format を使う と整理しています。
Responses API と Chat Completions API で何が違うか
Responses APIの記事 でも触れた通り、今後は Responses API を中心に考える方が自然です。
Structured Outputs でも、指定の仕方が少し違います。
Chat Completions API
Chat Completions では、従来の response_format を使います。
Responses API
Responses API では、text.format を使います。
この差は小さく見えますが、移行時にははまりやすいです。
前のサンプルをそのまま持っていったら動かない になりやすいので、Responses API に寄せるときはここを意識した方がいいです。
JSON mode を使う場面はまだあるのか
あります。
ただし、schema まではいらないが、JSON として壊れていなければ十分 という場面に限られます。
例えば、
- とりあえず JSON で返ってくればよい簡易ログ
- 後段で柔軟に吸収できる軽い用途
- 古い実装との互換性を優先する場面
です。
逆に、少しでも
- 厳密な key 名が必要
- downstream parser が厳しい
- enum のズレが困る
- UI にそのまま流し込む
なら、Structured Outputs の方が向いています。
実務でのおすすめ判断
迷ったら、次のように考えるとかなり整理しやすいです。
valid JSON なら十分なら JSON modeschema どおりでないと困るなら Structured Outputs- ツールの引数を厳密にしたいなら function calling 側の schema
- ユーザーへの返答そのものを構造化したいなら
text.formatなどの Structured Outputs
特に最近の OpenAI API は、reasoning、ツール、会話状態、出力制約を API 側で持たせる方向に寄っています。
その流れの中では、JSON mode より Structured Outputs を主役にした方が自然です。
結論
Structured Outputs は、JSON を返す より一段深く、欲しい shape を守らせる ための機能です。
JSON mode はまだ使えますが、OpenAI公式の方向性はかなり明確で、可能なら Structured Outputs を使う 側です。
雑にまとめるなら、
- JSON mode =
壊れていない JSON - Structured Outputs =
使える JSON
です。
アプリに取り込む前提なら、この差はかなり大きいです。
この記事と一緒に読みたい
- OpenAIのResponses APIとは?Chat Completionsからいつ移るべきか
- GPT-5.5移行でプロンプトはそのままでいい?OpenAI公式ガイドで見る見直しポイント
- GPT-5.5とは?OpenAI最新モデルの性能・料金・ChatGPTとAPI対応を整理
- プロンプトキャッシュとは?AI APIのコストと応答速度に効く理由
参考リンク
- OpenAI Developers: Structured model outputs
- OpenAI Developers: Migrate to the Responses API
- OpenAI Developers: Function calling
- OpenAI Developers: Using GPT-5.5