Solución: Unexpected end of JSON input al hacer JSON.parse()
JSON.parse() recibe un string vacío, truncado o que no es JSON válido. Todas las causas posibles y cómo validar antes de parsear para evitar el crash.
¿Por qué ocurre?
JSON.parse() recibió un string vacío (''), null, undefined, o un string que no es JSON válido (un error HTML, un mensaje de texto plano, o datos truncados). Ocurre con frecuencia cuando la API devuelve un error 4xx/5xx sin cuerpo JSON, cuando localStorage tiene un valor vacío o corrompido, o cuando un stream de datos se cortó a la mitad.
Solución paso a paso
Caso 1 — Respuesta de API que no es JSON:
// ❌ Asumes que la respuesta siempre es JSON válido
const res = await fetch('/api/datos');
const data = await res.json(); // SyntaxError si la API devuelve un error HTML// ✅ Comprueba el status y el Content-Type antes
const res = await fetch('/api/datos');
if (!res.ok) {
throw new Error(Error HTTP: ${res.status});
}
const contentType = res.headers.get('content-type');
if (!contentType?.includes('application/json')) {
const texto = await res.text();
throw new Error(Respuesta no JSON: ${texto});
}
const data = await res.json();
Caso 2 — localStorage vacío o corrompido:
// ❌ Si la clave no existe, devuelve null → JSON.parse(null) falla
const config = JSON.parse(localStorage.getItem('config')); // SyntaxError// ✅ Proporciona un fallback
const raw = localStorage.getItem('config');
const config = raw ? JSON.parse(raw) : {};
// ✅ O con try/catch para datos que podrían estar corrompidos
function leerDeStorage(clave, valorPorDefecto = null) {
try {
const raw = localStorage.getItem(clave);
return raw !== null ? JSON.parse(raw) : valorPorDefecto;
} catch {
localStorage.removeItem(clave); // limpia el valor corrupto
return valorPorDefecto;
}
}
Caso 3 — String vacío o undefined:
// ❌
JSON.parse(''); // SyntaxError
JSON.parse(undefined); // SyntaxError
JSON.parse(null); // devuelve null (¡no falla!, pero puede sorprender)// ✅ Valida antes de parsear
function parsearSeguro(texto, fallback = null) {
if (!texto || typeof texto !== 'string') return fallback;
try {
return JSON.parse(texto);
} catch {
return fallback;
}
}
Cómo debuggear el valor que falla:
// Imprime el valor antes de parsear para ver qué recibes
console.log('Valor a parsear:', JSON.stringify(texto));
console.log('Tipo:', typeof texto, '| Longitud:', texto?.length);
Cómo evitarlo en el futuro
Nunca llames a JSON.parse() sin validar que el input es un string no vacío. Envuelve siempre la lectura de localStorage y las respuestas de API en try/catch o en funciones helper que gestionen el error.
¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:
Generador de Prompts