Saltar al contenido principal
JavaScript

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.

Error: SyntaxError: Unexpected end of JSON input

¿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.

JavaScriptJSONAPIErrorfetch

¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:

Generador de Prompts

¿Necesitas desarrollo a medida?

Apps web, IA, módulos ERP — cuéntame tu proyecto.