← Todos los artículos

Carácter no blanco inesperado tras los datos JSON: arreglos

Este error significa que hay contenido extra después de un valor JSON completo — objetos concatenados, NDJSON parseado como un solo bloque o basura al final. Cómo encontrar y eliminar los datos sobrantes.

SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data significa que el parser leyó con éxito un valor JSON completo —— y luego encontró más contenido no-espacio después. JSON solo permite un valor de primer nivel, así que cualquier cosa que vaya detrás es un error. Aquí están las causas del «extra data» y cómo arreglarlas.

Cómo se ve el error

// Firefox
SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data
  at line 1 column 18 of the JSON data

// V8 (Chrome / Node / Edge)
SyntaxError: Unexpected non-whitespace character after JSON at position 17
SyntaxError: Unexpected token { in JSON at position 17   // redacción antigua

// Python (análogo)
json.decoder.JSONDecodeError: Extra data: line 1 column 18 (char 17)

La posición señala el primer carácter después del valor válido —— ahí empieza «el extra».

Por qué ocurre

Causa 1 —— Dos valores JSON concatenados

// ❌ dos objetos pegados —— valor válido y luego más
{"id":1}{"id":2}
//      ^ posición 8: no-espacio después del JSON

// ✅ envuélvelos en un array
[{"id":1},{"id":2}]

Causa 2 —— NDJSON / JSON Lines parseado de golpe

Los ficheros de log y las APIs en streaming emiten a menudo un objeto JSON por línea (NDJSON). JSON.parse() solo lee el valor de la primera línea y tropieza con el siguiente.

// ❌ JSON.parse sobre todo el fichero
{"event":"login"}
{"event":"logout"}

// ✅ parsea línea por línea
const rows = text
  .split('\n')
  .filter(Boolean)
  .map((line) => JSON.parse(line));

Causa 3 —— Basura al final o respuesta duplicada

// ❌ texto suelto, payload duplicado o punto y coma al final
{"ok":true};
{"ok":true}  // línea de debug añadida por un proxy
extra

JSON-RPC y otros streams con framing

Si consumes un protocolo —— JSON-RPC sobre stdio, el Language Server Protocol (LSP), el Debug Adapter Protocol —— múltiples mensajes JSON fluyen por un mismo canal por diseño. Cada uno lleva una capa de framing que dice cuán largo es el siguiente mensaje, precisamente para que no acabes intentando parsear dos valores en un solo buffer:

Content-Length: 87\r\n
\r\n
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{...}}Content-Length: 42\r\n
\r\n
{"jsonrpc":"2.0","id":1,"result":{...}}

La regla: lee la cabecera Content-Length, lee exactamente esos bytes, parsea un valor JSON y repite. Si te bebes todo el canal y parseas una vez, vas a chocar con «unexpected non-whitespace character after JSON data», porque dentro hay muchos valores.

Para NDJSON la regla equivalente es «splitea por \n y parsea cada línea». La idea común: un stream de mensajes JSON siempre necesita una capa de framing; la concatenación cruda no es JSON legal.

Cómo arreglarlo —— paso a paso

  1. Salta a la posición reportada —— todo a partir de ahí es el «extra». Mira lo que sigue justo al primer valor completo.
  2. ¿Varios valores? Si querías una lista, envuélvelos en un array [ … ] separados por comas.
  3. ¿NDJSON / JSON Lines? Splitea por saltos de línea y parsea cada línea por separado —— no parsees el fichero entero a la vez.
  4. ¿Basura al final? Recorta los caracteres extraños (un punto y coma, un payload duplicado, salida de debug) antes de parsear.
  5. ¿En streaming? Asegúrate de no estar concatenando varias respuestas en un buffer antes de parsear.

Preguntas frecuentes

¿Qué significa «unexpected non-whitespace character after JSON data»?

El parser leyó un valor JSON válido y después encontró más contenido. JSON solo admite un único valor de primer nivel, así que los caracteres siguientes son inválidos.

¿Cómo parseo varios objetos JSON?

Si están concatenados, envuélvelos en un array. Si son uno por línea (NDJSON / JSON Lines), splitea por el salto de línea y haz JSON.parse() a cada línea por separado.

¿Es lo mismo que «Unexpected end of JSON input»?

Son lo contrario. Este error significa que hay demasiados datos (más después de un valor completo); «Unexpected end of JSON input» significa que hay demasiado pocos (el valor se cortó).

Arréglalo ahora