The problem with legacy json_object mode
Before Structured Outputs, the standard approach was `response_format: {"type": "json_object"}`. This tells the model to emit valid JSON — but it says nothing about what that JSON should look like. The model is free to invent keys, omit required fields, nest objects differently than you expected, or emit an empty object `{}` when it has nothing to say.
In practice, json_object mode cuts parse errors to near zero — you rarely get a SyntaxError anymore. What you get instead are semantic errors: missing required fields, unexpected null values, arrays where you expected strings, extra keys your code doesn't handle. These require a full retry at full token cost, and they happen at rates of 2-8% per call in production depending on how clearly you describe the schema in your system prompt.
The retry cost is the hidden tax of json_object mode. Each failed parse means re-sending the full input context. At gpt-4o prices ($2.50/1M input, $10.00/1M output as of June 2026), a 5% retry rate on a 2k-token prompt adds about 10% to your effective per-call cost. For high-volume extraction pipelines, that's real money. See the numbers in our AI Cost Optimization Checklist for the before/after math on switching to strict mode.
The other problem with json_object is testing: because the schema lives in your system prompt as natural language, there's no machine-checkable contract between your prompt and your application code. When a field name changes, or you add a new required field, you're relying on the model to read your prose description correctly. That's a fragile guarantee — and it's exactly what Structured Outputs replaces.