Il 22 ottobre 2026 la guida OpenAI dice che JSON mode e Structured Outputs producono JSON valido, ma solo il secondo aderisce allo schema. json_object non è json_schema.
Il 22 ottobre 2026, sulla guida OpenAI Structured model outputs, JSON mode non è Structured Outputs. La pagina lo scrive in una sezione titolata proprio così: Structured Outputs è l’evoluzione di JSON mode. Tutti e due possono produrre JSON valido. Solo Structured Outputs, in quella tabella, aderisce allo schema. Non ho chiamato l’API. Non è la stessa cosa di Google-Extended contro GPTBot, e non è il calendario dell’AI Act.
In breve: JSON mode, nella Chat Completions, è response_format: { "type": "json_object" }. Nella Responses API è text.format con type: "json_object". Structured Outputs, in tabella, è json_schema con strict: true, oppure l’equivalente in text.format. Lo schema non è garantito dal json_object. La parola «JSON» deve comparire nel contesto, altrimenti l’API risponde con un errore.
Cosa trovi in questo articolo
Valido non vuol dire aderente allo schema
La guida, letta il 22 ottobre, definisce Structured Outputs come la funzione che fa aderire la risposta a uno JSON Schema fornito da chi chiama: niente chiave obbligatoria omessa, niente enum inventato. I benefici scritti in cima sono tre: type-safety senza validare o ritentare il formato, rifiuti di sicurezza rilevabili dal programma, prompt più semplici perché non serve insistere sul formato. Le librerie Python e JavaScript possono descrivere lo schema con pydantic o con l’equivalente mostrato negli esempi. Non ho installato quelle librerie.
Più sotto, la frase che separa le due modalità: «While both ensure valid JSON is produced, only Structured Outputs ensure schema adherence.» JSON mode è «a more basic version». Garantisce JSON valido, «except for in some edge cases that you should detect and handle appropriately». Non garantisce lo schema. Se Structured Outputs non è disponibile per il caso d’uso, la guida dice di validare con una libreria e, se serve, di ritentare.
Come si accende JSON mode. Chat Completions: response_format a { "type": "json_object" }. Se si usa function calling, la pagina dice che JSON mode è sempre acceso. Responses API: text.format a { "type": "json_object" }, e anche lì function calling lo accende sempre. Structured Outputs, nella stessa tabella, si accende con response_format: { type: "json_schema", json_schema: {"strict": true, "schema": ...} } oppure, sulla Responses API, con text: { format: { type: "json_schema", "strict": true, "schema": ... } }.
Nota della guida, non un consiglio mio: in JSON mode bisogna dire al modello di produrre JSON, per esempio nel messaggio di sistema. Se l’istruzione manca, il modello può generare uno stream infinito di spazi finché non esaurisce i token. Per ricordarlo, l’API lancia un errore se la stringa «JSON» non compare da qualche parte nel contesto. Non ho provocato quell’errore. Lo riporto come frase della pagina.
La tabella della guida, non un riassunto mio
| Riga della tabella «Structured Outputs vs JSON mode» | Structured Outputs | JSON mode |
|---|---|---|
| Outputs valid JSON | Yes | Yes |
| Adheres to schema | Yes, con rinvio agli schemi supportati | No |
| Compatible models, come stampati | gpt-4o-mini, gpt-4o-2024-08-06, and later | gpt-3.5-turbo, gpt-4-*, gpt-4o-*, and compatible GPT-5 models |
| Enabling, Chat Completions | response_format type json_schema, strict true | response_format type json_object |
| Enabling, Responses API | text.format type json_schema, strict true | text.format type json_object |
La stessa pagina dice che entrambe le modalità sono supportate in Responses API, Chat Completions API, Assistants API, Fine-tuning API e Batch API, e che conviene usare Structured Outputs al posto di JSON mode quando è possibile. L’eccezione scritta subito dopo: response_format con type: "json_schema" è supportato dagli snapshot gpt-4o-mini, gpt-4o-mini-2024-07-18 e gpt-4o-2024-08-06 in poi. Non ho verificato un listino prezzi né un modello in console.
Structured Outputs, ancora in guida, sta in due forme: function calling, quando il modello deve chiamare una funzione dell’applicazione, e json_schema come formato di risposta, quando serve il testo aderente allo schema e non una chiamata. Il resto della guida che ho seguito riguarda il secondo caso, sulla Responses API. La function calling ha una pagina sua. Non l’ho riscritta qui.
Due elenchi di modelli, sulla stessa pagina
La tabella non è l’unico elenco. Nella sezione Supported models la guida scrive che Structured Outputs è disponibile nei modelli grandi più recenti, a partire da GPT-4o, e che per i progetti nuovi si parte da gpt-6-astra. I modelli più vecchi, «like gpt-4-turbo and earlier», possono usare JSON mode al posto suo. Questa frase e la riga «Compatible models» della tabella non usano gli stessi nomi. Non le ho unite in un elenco solo. Chi sceglie un modello deve leggere la riga che corrisponde alla chiamata che sta facendo, non un sunto.
Un altro confine, nella sezione JSON mode: l’output è JSON valido salvo edge case in cui l’oggetto non è completo. L’applicazione deve riconoscerli. Non ho copiato gli esempi di codice Python che stanno sotto quella frase: non li ho eseguiti, e non aggiungono un fatto che la prosa non dica già.
Questo pezzo non parla di un CMS, di un chatbot da incorporare in un sito, né di un obbligo dell’AI Act. Quei temi stanno negli altri articoli linkati in apertura. Qui il punto è solo la differenza, nella documentazione OpenAI letta oggi, tra json_object e json_schema strict.
Errori da evitare
Credere che
json_objectrispetti lo schema. In tabella, Adheres to schema è No.Omettere la parola JSON dal contesto quando si accende JSON mode. La guida dice che l’API risponde con un errore.
Spegnere la validazione perché «è JSON valido». Valido e aderente, in pagina, sono due righe diverse. Gli edge case restano.
Trattare function calling e
json_schemacome la stessa chiamata. La guida li separa.Fondere gpt-6-astra, gpt-4o-2024-08-06 e «gpt-4-*» in un’unica compatibilità. Sono frasi diverse della stessa pagina.
Confondere questa pagina con robots.txt, con Google-Extended o con una scadenza dell’AI Act. Non ne parlano.
In sintesi
Il 22 ottobre 2026 la guida OpenAI Structured Outputs dice che JSON mode è la versione più semplice: JSON valido, schema non garantito, type: "json_object". Structured Outputs è l’evoluzione: adesione allo schema, json_schema con strict: true, consigliata quando il modello la supporta. La tabella e la sezione Supported models elencano i modelli in due modi. Non ho chiamato l’API e non ho sciolto io quella differenza. Senza la parola JSON nel contesto, la pagina prevede un errore, non uno schema.
Foto di copertina: Marcin Wichary, «IBM 1402 punch card reader», Computer History Museum, 7 marzo 2009, Wikimedia Commons, CC BY 2.0. Il file è quel lettore; l’inquadratura è il meccanismo, non una scheda forata e non uno JSON Schema.