SyntaxError: Unexpected token 'u', "undefined" is not valid JSON (motores antiguos: Unexpected token u in JSON at position 0) casi siempre significa que llamaste a JSON.parse(undefined). JavaScript convierte undefined a la cadena "undefined", y el parser se atasca en la u inicial. Aquí está el porqué y cómo arreglarlo.
Cómo se ve el error
// V8 (Chrome / Node / Edge)
SyntaxError: "undefined" is not valid JSON
SyntaxError: Unexpected token 'u', "undefined" is not valid JSON
SyntaxError: Unexpected token u in JSON at position 0 // V8 más viejo
// Firefox
SyntaxError: JSON.parse: unexpected character at line 1 column 1
// Safari
SyntaxError: JSON Parse error: Unexpected identifier "undefined" La u en la posición 0 es la primera letra de la cadena "undefined" —— el parser nunca recibió datos reales.
Por qué pasa: parseaste undefined
JSON.parse() coerciona primero su argumento a cadena. Pasa undefined y parseará el texto literal "undefined", que no es JSON válido. Que el valor sea undefined suele deberse a:
- Una variable o argumento de función al que nunca se asignó valor
- Una propiedad de objeto que no existe (typo o estructura equivocada):
obj.missing - Un valor async que aún no está listo (parseado antes del
await) - Una función sin
returnusada como fuente
Ejemplo roto
const cached = localStorage.getItem('settings'); // clave ausente → null, OK
const draft = window.appState?.draft; // propiedad ausente → undefined
const data = JSON.parse(draft); // ❌ "undefined" is not valid JSONEjemplo arreglado
// Guard antes de parsear
const data = draft ? JSON.parse(draft) : null;
// O un helper seguro
function safeParse(text, fallback = null) {
if (typeof text !== 'string' || text.trim() === '') return fallback;
try { return JSON.parse(text); } catch { return fallback; }
}
const data2 = safeParse(draft); Nota: JSON.parse(null) no lanza —— devuelve null —— y localStorage.getItem() devuelve null (no undefined) para una clave inexistente. Así que un error u apunta específicamente a un valor undefined, no a una clave de storage ausente.
SyntaxError vs TypeError: por qué obtienes éste
Un detalle sutil pero útil: JSON.parse(undefined) lanza un SyntaxError, no un TypeError. ¿Por qué? Porque la spec dice que JSON.parse primero coerciona su argumento a una cadena ("undefined") y luego parsea esa cadena. El error es «esta cadena no es JSON válido», no «pasaste el tipo equivocado». Por eso JSON.parse(undefined) y JSON.parse("undefined") producen el mismo mensaje de posición 0.
Compara con APIs que sí hacen type-check, como JSON.stringify(BigInt(1)) → TypeError, o JSON.parse(Symbol()) → TypeError (los Symbols no se pueden coercionar a cadena). Si capturas errores de parseo, estrecha con err instanceof SyntaxError para manejar datos malos aparte de argumentos malos.
Cómo arreglarlo —— paso a paso
- Loguea la entrada:
console.log(typeof src, src)justo antes del parse. Si imprimeundefined, ése es el culpable. - Traza dónde debería establecerse —— un campo de state sin inicializar, un argumento ausente o una propiedad que no existe en el objeto.
- Añade un guard (
if (src)) o un fallbacksafeParsepara que un valor ausente no llegue aJSON.parse(). - Si es async, asegúrate de hacer
awaitdel valor antes de parsear.
Preguntas frecuentes
¿Qué significa «Unexpected token u in JSON at position 0»?
Pasaste undefined a JSON.parse(). Se convierte en la cadena "undefined", y la u inicial no es un carácter de inicio JSON válido.
¿Es lo mismo que los errores «token o» o «token <»?
Misma familia, distinto valor. u = undefined; token o = un objeto convertido a [object Object]; token < = una respuesta HTML. El carácter nombrado te dice qué se pasó realmente.
¿Por qué JSON.parse(null) no lanza el mismo error?
"null" es JSON válido, así que JSON.parse(null) devuelve null. Solo undefined (→ "undefined") dispara el error u.
Arréglalo ahora
- JSON Fix —— valida y repara JSON en tu navegador
- Cómo arreglar los errores «Unexpected Token» de JSON.parse —— cada variante de token
- Unexpected token o in JSON at position 1 —— el error hermano de objeto
- Cómo manejar JSON roto en JavaScript —— patrones de safe-parse