SyntaxError: Unexpected token o in JSON at position 1 — quella o minuscola è il secondo carattere di [object Object]. Significa che hai passato un oggetto JavaScript direttamente a JSON.parse() invece di una stringa JSON. Questo articolo spiega ogni variante di questo errore e come correggerla in meno di un minuto.
Perché l'errore dice "token o"
Quando passi un valore non-stringa a JSON.parse(), JavaScript prima lo converte forzatamente in stringa. Un oggetto semplice viene convertito in "[object Object]". Il parser vede [ in posizione 0 (valido — inizio di un array), poi o in posizione 1 (non valido — non è un elemento valido di un array). Ecco perché: Unexpected token o at position 1.
JSON.parse({})
// Equivalente a: JSON.parse("[object Object]")
// SyntaxError: Unexpected token o in JSON at position 1La causa più comune: non fare await su response.json()
Questa è la prima causa di questo errore nelle codebase reali. Un oggetto Response di fetch() non è una stringa — è un wrapper su ReadableStream. Passarlo a JSON.parse() lo converte in "[object Response]".
// ❌ Sbagliato — response è un oggetto Response, non una stringa
const response = await fetch('/api/user');
const data = JSON.parse(response);
// SyntaxError: Unexpected token o in JSON at position 1
// ✓ Corretto — lascia che sia il browser a fare il parse dello stream come JSON
const data = await response.json(); Analogamente, se chiami response.text() senza await, ottieni un oggetto Promise (che viene convertito in "[object Promise]").
// ❌ Manca await — text è una Promise, non una stringa
const text = response.text();
const data = JSON.parse(text);
// SyntaxError: Unexpected token o in JSON at position 1
// ✓ Corretto
const text = await response.text();
const data = JSON.parse(text);Altri oggetti che innescano questo errore
| Cosa hai passato | In cosa JS lo converte | Token dell'errore |
|---|---|---|
{} o qualsiasi oggetto semplice | "[object Object]" | token o in posizione 1 |
undefined | "undefined" | token u in posizione 0 |
true / false | "true" / "false" — in realtà JSON valido! | nessun errore |
Un oggetto Response | "[object Response]" | token o in posizione 1 |
Una Promise | "[object Promise]" | token o in posizione 1 |
null | "null" — JSON valido | nessun errore (restituisce null) |
Causa: passare un oggetto invece di serializzarlo
Un errore correlato: provare a "parsare" un oggetto JavaScript che hai già in memoria. JSON.parse() accetta una stringa; se hai già un oggetto, non serve farne il parse.
const config = { host: 'localhost', port: 3000 };
// ❌ Inutile — config è già un oggetto
const parsed = JSON.parse(config);
// ✓ Per una copia profonda, usa structuredClone o stringify + parse
const clone = JSON.parse(JSON.stringify(config));
// ✓ Per inviarlo, usa JSON.stringify
const body = JSON.stringify(config);Causa: Python o altri backend restituiscono un Content-Type sbagliato
A volte il server restituisce un messaggio di errore in testo semplice (come "ok" o "not found") con stato 200 e senza header Content-Type. Il frontend presume JSON, chiama response.json() e riceve un errore di token inatteso perché il corpo non è JSON valido.
// Il server invia la stringa letterale: ok
// Il browser prova a fare il parse come JSON:
JSON.parse("ok")
// SyntaxError: Unexpected token o in JSON at position 0Correzione: Controlla sempre response.ok e response.headers.get('Content-Type') prima di chiamare response.json():
const response = await fetch('/api/action');
if (!response.ok) {
const text = await response.text(); // sicuro — potrebbe non essere JSON
throw new Error(`HTTP ${response.status}: ${text}`);
}
const data = await response.json();Varianti meno comuni di [object X]
Qualsiasi valore il cui toString() restituisce una stringa che inizia con [object innesca lo stesso errore in posizione 1. Oltre a [object Object], quelle che ti capita davvero di vedere nel codice reale:
[object Module]— passare il risultato di un import dinamico:const mod = await import('./data.json', { with: { type: 'json' } }); quello che vuoi èmod.default, nonmod.[object AsyncFunction]— passare il riferimento di una funzione asincrona invece di chiamarla: serializzafn()(il valore risolto della promise), nonfn.[object HTMLDocument]— passaredocumentper errore (per es. da uno snippet del debugger dimenticato).[object FormData]— usarefetch(url, { body: formData })va bene, maJSON.parse(formData)no — converti prima conObject.fromEntries(formData).
Checklist rapida per la correzione
- fetch + JSON.parse? Sostituisci con
await response.json(). - Manca un await da qualche parte nella catena? Ogni chiamata
asyncprima del parse deve essere awaited. - Hai già un oggetto? Non serve farne il parse — usalo direttamente o clonalo con
structuredClone(). - Il server restituisce non-JSON in caso di errore? Leggi con
response.text(), non conresponse.json(), quando la risposta potrebbe non essere JSON.
Domande frequenti
Cosa significa "Unexpected token o in JSON at position 1"?
Hai passato un oggetto JavaScript a JSON.parse(). JavaScript converte forzatamente l'oggetto nella stringa "[object Object]"; il parser accetta [ in posizione 0 ma rifiuta la o in posizione 1.
Come lo risolvo con fetch?
Non chiamare JSON.parse(response). Usa await response.json(), che legge lo stream di risposta e lo parsa per te. Assicurati che ogni passo della catena sia awaited.
Mi serve JSON.parse se ho già un oggetto?
No. JSON.parse() converte solo una stringa JSON in un valore. Se hai già un oggetto, usalo direttamente, o fai una deep clone con structuredClone() invece di JSON.parse(JSON.stringify(obj)).
"Unexpected token o" è lo stesso di "[object Object] is not valid JSON"?
Hanno la stessa causa di fondo — un oggetto convertito in stringa prima del parse. Le build più recenti di V8 stampano la dicitura [object Object] is not valid JSON; quelle più vecchie stampano Unexpected token o. Vedi Correggere "[object Object] is not valid JSON" per l'analisi completa.
Ispeziona la risposta grezza
Se non sei sicuro di cosa stia restituendo la tua API, incolla il corpo grezzo in JSON Fix per validarlo. Se non è JSON valido, il validatore ti dirà esattamente cosa c'è di sbagliato.
- JSON Fix — validare e riparare JSON nel browser
- Correggere "[object Object] is not valid JSON" — la guida completa agli errori di sintassi JSON
- Unexpected end of JSON input — quando il parser esaurisce i dati prima che la struttura sia completa
- Gestire JSON rotto in JavaScript — pattern di parse sicuro e recupero degli errori