"Unexpected token o in JSON at position 1" — cosa significa davvero
Questo errore non significa quasi mai che il tuo JSON sia rotto. Significa che hai chiamato JSON.parse su qualcosa che non è mai stato una stringa JSON — e la lettera nel messaggio ti dice esattamente cosa hai passato.
Se stai fissando un "Unexpected token o in JSON at position 1", il tuo JSON è probabilmente perfetto. Questo errore significa che JSON.parse ha ricevuto un valore che era già un oggetto JavaScript, non una stringa di testo JSON. È uno dei messaggi di errore più fuorvianti di JavaScript, perché punta ai dati mentre il bug è nella chiamata.
Da dove arriva la "o"
JSON.parse accetta solo una stringa. Se gli passi un oggetto, JavaScript converte silenziosamente quell'oggetto in testo — e qualsiasi oggetto semplice diventa il testo letterale "[object Object]". Il parser inizia allora a leggere quel testo: la posizione 0 è "[", un modo perfettamente valido di iniziare un array JSON, quindi prosegue. La posizione 1 è "o", che non è né un valore, né una chiave, né una parentesi valida. Da qui: unexpected token o, alla posizione 1. La "o" di cui ti avverte è la seconda lettera della parola "object".
Le tre situazioni che lo provocano
Di gran lunga la più comune è il doppio parsing. Metodi come res.json() di fetch o axios analizzano già il corpo della risposta per te, quindi chiamare JSON.parse sul risultato analizza qualcosa che è già un oggetto. La seconda è passare un oggetto direttamente a JSON.parse quando in realtà intendevi JSON.stringify — i due si scambiano facilmente quando si va di fretta. La terza è leggere da uno storage come localStorage dove una scrittura precedente ha salvato un oggetto senza stringificarlo, così il valore memorizzato è il testo letterale "[object Object]" e fallirà per sempre finché non lo cancelli.
Gli errori vicini, e cosa dice ogni carattere
Il carattere indicato nel messaggio è una diagnosi precisa, quindi leggilo invece di saltarlo. "Unexpected token <" significa che hai ricevuto HTML e non JSON — quasi sempre una pagina di errore 404 o 500, un redirect al login, o l'intercettazione di un proxy, e il vero bug è nella richiesta, non nel parsing. "Unexpected end of JSON input" significa che il corpo era completamente vuoto, tipico di una risposta 204 o di una richiesta fallita prima di restituire qualcosa. "Unexpected token }" di solito indica una virgola finale prima della parentesi graffa di chiusura, cosa che i letterali oggetto di JavaScript permettono ma che JSON vieta rigorosamente. E "Unexpected token '" significa che sono state usate virgolette singole per le stringhe: di nuovo JavaScript valido, ma JSON non valido.
Come trovarlo in dieci secondi
Prima di toccare qualsiasi logica di parsing, stampa typeof ilTuoValore subito prima della chiamata a JSON.parse. Se restituisce "object", elimina il JSON.parse — il valore è già analizzato e stavi per de-analizzarlo. Se restituisce "string", apri la scheda Network dei devtools del browser e guarda il corpo della risposta grezzo, non l'anteprima formattata, perché i devtools mostrano volentieri una pagina di errore HTML in un modo che sembra strutturato. Il testo grezzo ti dice la verità con un'occhiata.
Una volta ottenuto il testo reale della risposta, incollalo nel nostro formattatore JSON — valida la sintassi e indica il carattere esatto in cui la struttura si rompe, molto più rapido che leggere a occhio un payload minificato su una sola riga. Tutto funziona nel tuo browser, quindi è sicuro incollare una risposta reale di un'API.