← Todos los artículos

Unexpected Token u en JSON en la posición 0: parseando undefined

El error «Unexpected token u» significa que llamaste a JSON.parse(undefined). Aprende por qué undefined se convierte en "undefined", cómo protegerte y un helper de parseo seguro.

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 return usada 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 JSON

Ejemplo 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

  1. Loguea la entrada:console.log(typeof src, src) justo antes del parse. Si imprime undefined, ése es el culpable.
  2. Traza dónde debería establecerse —— un campo de state sin inicializar, un argumento ausente o una propiedad que no existe en el objeto.
  3. Añade un guard (if (src)) o un fallback safeParse para que un valor ausente no llegue a JSON.parse().
  4. Si es async, asegúrate de hacer await del 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