"undefined" is not valid JSON
Le has pasado undefined a JSON.parse. Se convierte a la cadena "undefined", y JSON no tiene ese literal, así que falla en la posición 0. La pregunta de verdad es de dónde salió ese undefined, y solo hay unas tres respuestas.
También puede que lo veas escrito así
- Unexpected token u in JSON at position 0
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 Una clave de almacenamiento que nunca se estableció
localStorage.getItem devuelve null cuando falta la clave, y JSON.parse(null) de hecho funciona. Pero si alguna vez se escribió la cadena "undefined" en esa clave, leerla produce exactamente este error, de forma permanente, hasta que se limpie la clave.
Falla
localStorage.setItem('token', someUndefinedValue); // writes "undefined" JSON.parse(localStorage.getItem('token'));Funciona
const raw = localStorage.getItem('token'); const token = raw && raw !== 'undefined' ? JSON.parse(raw) : null; -
02 No se esperó a un valor asíncrono
Leer una propiedad de una promesa, o de un estado que aún no ha cargado, da undefined. El parseo se ejecuta antes de que lleguen los datos.
Falla
const data = JSON.parse(fetchUser().body);Funciona
const res = await fetchUser(); const data = JSON.parse(await res.text()); -
03 Una propiedad que no existe
Un campo renombrado, una errata, o una API que cambió de forma. obj.data cuando el payload usa obj.result da undefined sin ningún otro aviso.
Preguntas frecuentes
- ¿Por qué funciona JSON.parse(null) y JSON.parse(undefined) no?
- Los dos se convierten primero a cadena. null pasa a ser "null", que es un documento JSON válido, así que se parsea y devuelve null. undefined pasa a ser "undefined", y JSON no tiene ningún literal para eso.
- ¿Cómo limpio una clave que contiene la cadena "undefined"?
- localStorage.removeItem(clave), o protege la lectura como se muestra arriba. El valor malo persiste entre recargas, y por eso este error parece a menudo intermitente entre máquinas.
Arréglalo ahora
Pega el payload en la herramienta de arriba, o ve directamente a la creada para este trabajo.
Validar un payload