AI プログラミング ソフトウェア 公開日 2026.04.25 更新日 2026.04.25

Structured Outputsとは?JSON modeと何が違うのか

OpenAIのStructured Outputsについて、JSON modeとの違い、なぜ「JSONが返る」だけでは足りないのか、Responses API と Chat Completions API での指定方法の差、function calling と text.format の使い分けまで公式ドキュメントベースで整理します。

先に要点

  • JSON mode は「JSONとして壊れていない文字列を返させる」機能です。
  • Structured Outputs は、それに加えて 指定した schema に従わせる 機能です。
  • つまり違いの本質は、JSONが返るか ではなく、欲しい shape が保証されるか にあります。
  • OpenAI公式も、可能なら JSON mode より Structured Outputs を使うことを推奨しています。

OpenAIAPI を使っていると、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つの形で使えると整理されています。

  1. function calling の中で使う
  2. モデルの返答そのものを 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 の方が向いています。

実務でのおすすめ判断

迷ったら、次のように考えるとかなり整理しやすいです。

  1. valid JSON なら十分 なら JSON mode
  2. schema どおりでないと困る なら Structured Outputs
  3. ツールの引数を厳密にしたいなら function calling 側の schema
  4. ユーザーへの返答そのものを構造化したいなら 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

です。
アプリに取り込む前提なら、この差はかなり大きいです。

この記事と一緒に読みたい

  1. OpenAIのResponses APIとは?Chat Completionsからいつ移るべきか
  2. GPT-5.5移行でプロンプトはそのままでいい?OpenAI公式ガイドで見る見直しポイント
  3. GPT-5.5とは?OpenAI最新モデルの性能・料金・ChatGPTとAPI対応を整理
  4. プロンプトキャッシュとは?AI APIのコストと応答速度に効く理由

参考リンク

あとで見返すならここで保存

読み終わったあとに残しておきたい記事は、お気に入りからまとめて辿れます。