Erros de JSON, explicados
Cada página aqui pega uma mensagem de erro exata e responde a três perguntas: do que o parser estava realmente reclamando, o que causa isso em código real em ordem de frequência, e o que mudar. Cada uma embute o validador, então você conserta o seu payload sem sair da página.
As mensagens são medidas, não lembradas. Toda string de V8 e de Python neste site veio de rodar o parser. As strings do Firefox e do Safari estão deliberadamente ausentes, porque não conseguimos executá-las e verificá-las, e publicar um chute sobre uma mensagem de erro num site cujo argumento inteiro é a correção seria um mau negócio.
Ou simplesmente cole o payload
Nada do que você cola sai do seu navegador. A lista de permissões connect-src transforma isso em uma garantia do navegador, e não em uma promessa. Confira você mesmo
JavaScript, Node e Chrome
Medido no Node v24.15.0 com V8 13.6.233.17. O V8 reescreveu quase todas essas mensagens em 2022, então cada página traz tanto a redação atual quanto a que você vai encontrar em respostas antigas.
-
Unexpected token '<', "<!DOCTYPE "... is not valid JSONO servidor devolveu uma página de erro , e mais 4 causas. -
Unexpected end of JSON inputA string está vazia , e mais 4 causas. -
"[object Object]" is not valid JSONO valor já tinha sido parseado , e mais 2 causas. -
"undefined" is not valid JSONUma chave de armazenamento que nunca foi definida , e mais 2 causas. -
Unexpected non-whitespace character after JSON at position N (line L column C)A entrada é NDJSON ou JSON Lines , e mais 3 causas. -
Bad control character in string literal in JSON at position N (line L column C)Texto de várias linhas colado direto dentro de uma string , e mais 3 causas. -
Bad escaped character in JSON at position N (line L column C)Um caminho de arquivo do Windows com barras invertidas simples , e mais 3 causas. -
Expected double-quoted property name in JSON at position N (line L column C)Uma vírgula sobrando antes da chave de fechamento , e mais 2 causas. -
Expected property name or '}' in JSON at position N (line L column C)Chaves com aspas simples, de um dict do Python impresso com str() , e mais 3 causas. -
Expected ',' or '}' after property value in JSON at position N (line L column C)Uma vírgula faltando entre propriedades , e mais 3 causas. -
Unterminated string in JSON at position N (line L column C)Uma aspa dupla sem escape dentro do valor , e mais 3 causas.
Python
Medido no CPython 3.14.3. Duas dessas mensagens são novas no Python 3.13, então a versão importa e cada página diz qual.
-
Expecting value: line 1 column 1 (char 0)O corpo da resposta é HTML, não JSON , e mais 3 causas. -
Extra data: line L column C (char N)O arquivo é JSON Lines , e mais 2 causas. -
Expecting ',' delimiter: line L column C (char N)Uma aspa dupla sem escape dentro de uma string , e mais 3 causas. -
Expecting property name enclosed in double quotes: line L column C (char N)Um dict do Python impresso em vez de serializado , e mais 2 causas. -
Invalid control character at: line L column C (char N)Texto de várias linhas dentro de uma string , e mais 2 causas. -
Invalid \escape: line L column C (char N)Um caminho do Windows , e mais 2 causas. -
Unterminated string starting at: line L column C (char N)Uma aspa sem escape dentro do valor , e mais 2 causas.
PHP
O PHP falha em silêncio por padrão, e esse é o problema de verdade. A página cobre como arrancar dele uma mensagem de fato.
C# e .NET
Newtonsoft.Json e System.Text.Json redigem a mesma falha de formas diferentes.
Java
Jackson, que é o que quase tudo no ecossistema JVM usa por baixo.
Os quatro erros por trás da maioria destes
Tire a redação e quase toda mensagem desta página vem de uma entre quatro coisas.
- Não é JSON de jeito nenhum
- Uma página de erro HTML, um corpo vazio, uma mensagem em texto puro. O parser está certo e a requisição é que está errada. Confira o código de status e o Content-Type antes de conferir o corpo.
- É JavaScript ou Python, não JSON
- Aspas simples, chaves sem aspas, vírgulas finais, True e None. Quase sempre um dict ou um literal de objeto que foi impresso em vez de serializado. O reparo conserta tudo isso.
- Uma string foi construída por concatenação
- O que significa que os valores nunca foram escapados, então uma aspa ou uma quebra de linha dentro de um quebra o documento. Serializar em vez disso torna essa classe de bug impossível.
- São vários documentos, não um
- NDJSON lido como um valor só. Leia linha a linha ou embrulhe os registros num array.