← Todos os artigos

Caractere não-branco inesperado após os dados JSON: correções

Esse erro significa que há conteúdo extra depois de um valor JSON completo — objetos concatenados, NDJSON parseado como um bloco só, ou lixo no final. Como achar e remover os dados a mais.

SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data significa que o parser leu com sucesso um valor JSON completo —— e depois encontrou mais conteúdo não-espaço depois. JSON permite exatamente um valor de nível superior, então qualquer coisa depois é erro. Aqui está o que causa os „extra data“ e como corrigir.

Como o erro aparece

// 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   // redação antiga

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

A posição aponta para o primeiro caractere depois do valor válido —— é aí que o „extra“ começa.

Por que acontece

Causa 1 —— Dois valores JSON concatenados

// ❌ dois objetos colados —— valor válido, depois mais
{"id":1}{"id":2}
//      ^ posição 8: não-espaço depois do JSON

// ✅ envolva em um array
[{"id":1},{"id":2}]

Causa 2 —— NDJSON / JSON Lines parseado como um bloco

Arquivos de log e APIs de streaming costumam emitir um objeto JSON por linha (NDJSON). JSON.parse() só lê o valor da primeira linha e tropeça na próxima.

// ❌ JSON.parse no arquivo inteiro
{"event":"login"}
{"event":"logout"}

// ✅ parseie linha por linha
const rows = text
  .split('\n')
  .filter(Boolean)
  .map((line) => JSON.parse(line));

Causa 3 —— Lixo no fim ou resposta duplicada

// ❌ texto extra, payload duplicado ou ponto e vírgula no fim
{"ok":true};
{"ok":true}  // linha de debug adicionada por um proxy
extra

JSON-RPC e outros streams com framing

Se você está consumindo um protocolo —— JSON-RPC sobre stdio, o Language Server Protocol (LSP), o Debug Adapter Protocol —— várias mensagens JSON fluem pelo mesmo canal por design. Cada uma carrega uma camada de framing dizendo quão longa é a próxima, justamente para você não acabar tentando parsear dois valores em um 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":{...}}

A regra: leia o cabeçalho Content-Length, leia exatamente esses bytes, parseie um valor JSON, e itere. Se você engole o canal inteiro e parseia uma vez, bate em „unexpected non-whitespace character after JSON data“, porque tem muitos valores ali.

Para NDJSON a regra equivalente é „split em \n, parseie cada linha“. O fio comum: um stream de mensagens JSON sempre precisa de uma camada de framing; concatenação crua não é JSON legal.

Como corrigir —— passo a passo

  1. Vá para a posição reportada —— tudo dali em diante é o „extra“. Inspecione o que vem logo depois do primeiro valor completo.
  2. Vários valores? Se você quis uma lista, envolva em um array [ … ] separado por vírgulas.
  3. NDJSON / JSON Lines? Split em quebras de linha e parseie cada linha separadamente —— não parseie o arquivo todo de uma vez.
  4. Lixo no fim? Apare os caracteres soltos (ponto e vírgula, payload duplicado, saída de debug) antes do parse.
  5. Streaming? Confira que você não está concatenando várias respostas em um buffer antes do parse.

Perguntas frequentes

O que „unexpected non-whitespace character after JSON data“ significa?

O parser leu um valor JSON válido e depois encontrou mais conteúdo. JSON permite só um valor de nível superior, então os caracteres seguintes são inválidos.

Como parseio vários objetos JSON?

Se estão concatenados, envolva em um array. Se é um por linha (NDJSON / JSON Lines), faça split na quebra de linha e JSON.parse() cada linha individualmente.

É o mesmo que „Unexpected end of JSON input“?

São opostos. Este erro significa que há muitos dados (extra depois de um valor completo); „Unexpected end of JSON input“ significa que há poucos (o valor foi cortado).

Corrija agora