SyntaxError: Unterminated string in JSON at position N significa que el parser empezó a leer una cadena (vio una " de apertura) y llegó al final de la entrada —— o a un salto de línea —— antes de encontrar la " de cierre. La cadena nunca se cerró. Aquí están las causas y cómo arreglarlo.
¿Qué error de cadena estoy viendo?
- Unterminated string —— una cadena se abrió con
"pero nunca se cerró. - Bad control character —— un tab/salto de línea/byte nulo crudo aparece dentro de una cadena sin escapar.
- Bad escaped character —— una
\va seguida de algo que JSON no permite (p. ej.\x, rutas de Windows).
Cómo se ve el error
// V8 (Chrome / Node / Edge)
SyntaxError: Unterminated string in JSON at position 27
// Firefox
SyntaxError: JSON.parse: unterminated string at line 2 column 10 of the JSON data
// Safari
SyntaxError: JSON Parse error: Unterminated stringLa posición apunta a (o justo después de) la comilla de apertura de la cadena que nunca se cerró —— mira hacia delante desde ahí.
Por qué ocurre
Causa 1 —— Una comilla sin escapar cierra la cadena antes de tiempo
Una " literal dentro del valor cierra la cadena de forma prematura; el resto de la línea se lee como tokens inesperados, y la cadena de verdad queda «abierta».
// ❌ roto —— la comilla antes de hello cierra "He said "
{ "note": "He said "hello" to her" }
// ✅ arreglado —— escapa las comillas internas con barra invertida
{ "note": "He said \"hello\" to her" }Causa 2 —— Un salto de línea crudo dentro de la cadena
Las cadenas JSON no pueden cruzar saltos de línea crudos. Un salto literal termina la cadena y la deja sin cerrar.
// ❌ roto —— salto de línea real dentro de la cadena
{ "bio": "line one
line two" }
// ✅ arreglado —— usa el escape \n, sin salto crudo
{ "bio": "line one\nline two" }Causa 3 —— Datos truncados
Una respuesta cortada en mitad de la cadena (conexión perdida, límite de buffer/tamaño, lectura parcial) deja una cadena abierta al final de la entrada.
// lo que llegó (se cayó la conexión):
{"user":{"name":"Ada Lovel
// → Unterminated stringCómo arreglarlo —— paso a paso
- Salta a la posición reportada y encuentra la
"de apertura que no tiene cierre que la haga juego. - Busca una
"sin escapar dentro del valor —— escápala como\". - Busca un salto de línea/tab crudo dentro del valor —— sustitúyelo por
\n/\t. - Comprueba si hay truncado —— compara la longitud en bytes con
Content-Length; si es corta, los datos se cortaron (es un arreglo en el código, no en el texto). - Deja de construir JSON a mano. Usa
JSON.stringify(), que escapa comillas y caracteres de control por ti.
// Prevención: nunca concatenes cadenas para hacer JSON
const json = JSON.stringify({ note: userInput }); // siempre válidoPreguntas frecuentes
¿Qué causa «Unterminated string in JSON»?
Una " de apertura sin la " de cierre correspondiente —— normalmente una comilla sin escapar dentro del valor, un salto de línea crudo, o una respuesta truncada en mitad de cadena.
¿Cómo incluyo una comilla o un salto de línea dentro de una cadena JSON?
Escápalos: \" para comilla doble, \n para salto de línea, \t para tab. Construir el JSON con JSON.stringify() lo hace automáticamente.
¿Es lo mismo que «Unexpected end of JSON input»?
Relacionados pero distintos. «Unterminated string» significa que una cadena está abierta; «Unexpected end of JSON input» significa que toda la estructura (objeto/array) terminó antes. Las respuestas truncadas pueden disparar cualquiera de los dos.
Arréglalo ahora
- JSON Fix —— encuentra la cadena no terminada y repárala en tu navegador
- Unexpected End of JSON Input —— cuando toda la estructura se corta
- Bad Control Character en literal de cadena en JSON —— tabs/saltos de línea crudos en cadenas
- Bad Escaped Character en JSON —— escapes con barra invertida no válidos