"[object Object]" is not valid JSON
JSON.parse espera una cadena. Cuando le pasas un objeto, JavaScript convierte primero ese objeto a cadena, y la conversión por defecto produce el texto literal "[object Object]". El parser entonces falla en la letra o de la posición 1. Los datos están bien; la llamada a parse es la que sobra.
También puede que lo veas escrito así
- Unexpected token o in JSON at position 1
V8 reescribió la mayoría de sus mensajes de error de JSON en 2022. La redacción antigua sigue siendo la que muestran casi todos los resultados de búsqueda, pero ningún runtime actual la emite.
Pega tu JSON y ve exactamente dónde se rompe
Nada de lo que pegues sale de tu navegador. La lista de permitidos de connect-src convierte eso en una garantía del navegador, no en una promesa. Compruébalo tú mismo
Qué lo provoca realmente
Ordenados por la frecuencia con la que cada uno acaba siendo la respuesta.
-
01 El valor ya estaba parseado
axios, jQuery.ajax y muchos clientes de API parsean el JSON por ti cuando el Content-Type lo indica. Volver a parsear el resultado es lo que provoca esto.
Falla
const res = await axios.get('/api/user'); const user = JSON.parse(res.data); // res.data is already an objectFunciona
const res = await axios.get('/api/user'); const user = res.data; -
02 Se guardó un objeto sin convertirlo con stringify
localStorage y sessionStorage guardan cadenas. Pasarles un objeto llama a String(obj), lo que escribe el texto literal "[object Object]". En ese momento los datos se han perdido, no es que sean simplemente ilegibles.
Falla
localStorage.setItem('user', user); const back = JSON.parse(localStorage.getItem('user'));Funciona
localStorage.setItem('user', JSON.stringify(user)); const back = JSON.parse(localStorage.getItem('user')); -
03 Se interpoló un objeto dentro de una plantilla de cadena
Construir el cuerpo de una petición con `{"user": ${user}}` inserta "[object Object]" en vez del objeto. Construye el objeto y aplica stringify al conjunto.
Falla
body: `{"user": ${user}}`Funciona
body: JSON.stringify({ user })
Preguntas frecuentes
- ¿Qué fue de "Unexpected token o in JSON at position 1"?
- Esa era la redacción de V8 anterior a 2022 para el mismo error. La o era el segundo carácter de la cadena "[object Object]". El mensaje moderno cita en su lugar el texto problemático, lo cual es mucho más útil.
- ¿Cómo lo hago defensivo?
- typeof value === "string" ? JSON.parse(value) : value. Es una salvaguarda razonable en una frontera que no controlas, aunque dentro de tu propio código es mejor saber cuál de los dos tienes.
Arréglalo ahora
Pega el payload en la herramienta de arriba, o ve directamente a la creada para este trabajo.
Inspeccionar un payload