Skip to content
Back to Blog
jsondebuggingerror-fixdeveloper-tools

Corrija erros de "token inesperado em JSON" rapidamente

O erro de token inesperado em JSON quase sempre se deve a uma de seis causas. Este guia aborda cada uma, incluindo o caso sorrateiro de 'token <' que significa que você recebeu HTML, e mostra como encontrar a linha e coluna exatas.

SZ
Founder, Molixa
12 min read
Compartilhar
Corrija erros de "token inesperado em JSON" rapidamente
Table of contents6 sections

Um erro de token inesperado em JSON significa que seu parser encontrou um caractere que não esperava ao ler o que deveria ser um JSON válido. Quase nunca é um bug misterioso. Ele se deve a uma de seis causas concretas: vírgula à direita, aspas simples, uma resposta HTML, um BOM invisível, chaves sem aspas ou comentários. Este guia aborda cada uma e, mais importante, mostra como encontrar a linha e coluna exatas em vez de adivinhar.

A parte frustrante é que a mensagem de erro raramente aponta para o problema real. Token inesperado < em JSON na posição 0 não significa que seu JSON está quebrado. Significa que você não está olhando para JSON. Depois que você aprender a ler o que o parser está dizendo, a maioria dessas correções leva menos de um minuto.

O que "Token Inesperado em JSON" Realmente Significa#

JSON é um formato rigoroso. O analisador lê sua string caractere por caractere e constrói um valor. No momento em que encontra algo que não pode aparecer legalmente naquela posição, ele para e lança um SyntaxError. O "token" é o caractere que causou o erro.

Mecanismos modernos formulam a mensagem de forma diferente, o que aumenta a confusão:

  • V8 (Chrome, Node 20+): Unexpected token 'x', "...contexto..." is not valid JSON
  • Node / Chrome antigos: Unexpected token x in JSON at position 42
  • Firefox: JSON.parse: unexpected character at line 2 column 5 of the JSON data
  • Safari: JSON Parse error: Unexpected identifier

O campo mais útil é a posição ou o número da linha/coluna. O Firefox fornece linha e coluna diretamente. O V8 fornece uma posição em bytes e um trecho do texto ao redor. Leia isso primeiro, antes de ler qualquer outra coisa.

A maneira mais rápida de transformar uma posição enigmática em um problema visível é colar a string bruta em um validador que destaque a linha com erro. Nosso formatador e validador JSON gratuito marca o ponto exato e informa o que era esperado ali, o que reduz a maior parte da depuração abaixo a uma olhada.

As 6 Causas Reais (e Como Corrigir Cada Uma)#

Aqui está a distribuição honesta. Na depuração do mundo real, a grande maioria desses erros são as causas 1 a 3. As três últimas são mais raras, mas consomem horas porque são invisíveis ou contraintuitivas.

CausaMensagem típicaIndício
HTML em vez de JSONUnexpected token < na posição 0O primeiro caractere é < (um <!DOCTYPE ou <html>)
Vírgula sobressalenteUnexpected token } ou ]Uma vírgula está antes de uma chave ou colchete de fechamento
Aspas simplesUnexpected token 'Chaves ou strings usam ' em vez de "
BOM / caracteres ocultosUnexpected token na posição 0 em JSON aparentemente válidoParece perfeito, mas erra logo no início
Chaves sem aspasUnexpected token perto de uma chaveUma chave como nome: não tem aspas
ComentáriosUnexpected token /Existe um comentário // ou /* */ no arquivo

Causa 1: Você recebeu HTML, não JSON (o caso "token <")#

Esta é a que mais confunde as pessoas, e quase nenhum outro guia explica. Se você vir Unexpected token < in JSON at position 0, o < é a abertura de uma tag HTML. Sua chamada fetch esperava JSON, mas o servidor retornou uma página HTML.

Geralmente significa uma destas:

  • O endpoint retornou uma página de erro 404 ou 500 (HTML), não seu payload de API.
  • Você acessou a URL errada e recebeu o index.html do aplicativo.
  • Um proxy, tela de login ou limitador de taxa interceptou a requisição e serviu uma página HTML.

A correção não está no seu JSON. Registre o texto bruto da resposta antes de analisá-lo:

const res = await fetch(url);
const text = await res.text();
console.log(res.status, text.slice(0, 200)); // veja o que você realmente recebeu
const data = JSON.parse(text);

Se text começar com <!DOCTYPE html>, você encontrou. Verifique o código de status e a URL. Confirme também se o Content-Type da resposta é application/json, não text/html.

Causa 2: Vírgula sobressalente#

JSON não permite vírgula após o último item em um objeto ou array. Literais de objeto JavaScript permitem, e é exatamente por isso que isso passa despercebido. Você escreve JSON manualmente da mesma forma que escreve JS, e o analisador rejeita.

{
  "nome": "Ada",
  "cargo": "engenheira",   // esta vírgula sobressalente é inválida
}

Remova a vírgula após "engenheira". O mesmo se aplica a arrays: [1, 2, 3,] é JSON inválido. Um formatador sinaliza isso instantaneamente porque a vírgula ofensiva está logo antes de } ou ].

Causa 3: Aspas simples em vez de aspas duplas#

JSON exige aspas duplas tanto para chaves quanto para valores de string. Aspas simples são um hábito do JavaScript que o JSON não compartilha.

{ 'nome': 'Ada' }   // inválido: aspas simples em todo lugar
{ "nome": "Ada" }   // válido

Se você controla a fonte, troque cada ' por ". Se a string incorreta veio de algum lugar que você não pode editar, não faça substituição por regex cegamente (apóstrofos dentro de valores quebrarão). Em vez disso, execute-a através de uma ferramenta que entenda a estrutura.

Causa 4: O BOM invisível (e CRLF do Windows)#

Esta engana as pessoas por horas porque o JSON parece perfeito. Você vê JSON válido, cola e o analisador ainda lança erro na posição 0. O culpado é uma marca de ordem de byte, um caractere oculto U+FEFF que alguns editores (e o redirecionamento > do PowerShell no Windows) prefixam em arquivos UTF-8.

O analisador lê o BOM como o primeiro token e o rejeita. Para confirmar, verifique os primeiros bytes:

const text = fs.readFileSync("dados.json", "utf8");
console.log(text.charCodeAt(0)); // 65279 significa que um BOM está presente
const clean = text.replace(/^/, "");
JSON.parse(clean);

Salve o arquivo como UTF-8 sem BOM no seu editor (VS Code mostra a codificação na barra de status; clique e escolha "Salvar com Codificação"). No Windows, prefira Out-File -Encoding utf8NoBOM ou Set-Content em vez do redirecionamento >, que pode injetar o BOM. Retornos de carro soltos de quebras de linha CRLF podem causar estranhezas semelhantes na posição 0 quando JSON é concatenado ou transmitido.

Causa 5: Chaves sem aspas#

Em JavaScript, { nome: "Ada" } é válido. Em JSON, a chave deve ter aspas: { "nome": "Ada" }. Isso acontece mais quando alguém copia um literal de objeto JS para um arquivo .json ou corpo de API.

A correção é colocar aspas duplas em cada chave. Se você tem um objeto grande, um formatador não adicionará aspas automaticamente (isso seria adivinhar sua intenção), mas apontará exatamente a chave que falhou para que você possa corrigi-la rapidamente.

Causa 6: Comentários#

JSON não tem comentários. Nem //, nem /* */. As pessoas os adicionam em arquivos de configuração por hábito e então um analisador rigoroso falha.

{
  // configurações do app   <- inválido, JSON proíbe comentários
  "porta": 3000
}

Remova os comentários. Se você realmente precisa de configuração comentada, use um formato feito para isso (JSON5 ou JSONC, que o VS Code usa para suas próprias configurações) e analise-o com uma biblioteca que suporte esse dialeto, não com JSON.parse simples.

Como Encontrar a Linha e Coluna Exatas do Erro#

Esta é a habilidade que transforma uma caçada de 30 minutos em uma correção de 30 segundos, e é a parte que a maioria dos resultados de pesquisa ignora completamente. O erro fornece uma posição; veja como convertê-la em uma localização real.

Passo 1: Leia a posição ou linha/coluna do erro#

Capture o erro completo, não apenas a primeira palavra. No Node ou no navegador, envolva o parse:

try {
  JSON.parse(raw);
} catch (e) {
  console.error(e.message); // inclui posição ou linha:coluna
}

O Firefox já fornece linha X coluna Y. O V8 fornece uma posição em bytes. Anote esse número, você o usará a seguir.

Passo 2: Vá para essa posição na string bruta#

Se você tem uma posição em bytes (por exemplo, 142), fatie ao redor dela para ver o contexto que o parser viu:

console.log(raw.slice(130, 160));

O caractere no limite é o seu culpado. Ver 15 caracteres de cada lado quase sempre torna a causa óbvia: uma vírgula solta, uma aspa simples, uma tag HTML.

Passo 3: Cole em um validador que destaca o local#

Examinar posições em uma string longa é lento e propenso a erros. Cole o JSON bruto no formatador e validador JSON, que embeleza a estrutura e marca a linha com erro com uma mensagem clara sobre o que esperava. A própria reformatação muitas vezes revela o problema, pois uma vírgula mal colocada ou um colchete não fechado se torna visualmente óbvio uma vez que o aninhamento está indentado corretamente.

Passo 4: Corrija, revalide e depois teste novamente no código#

Aplique a correção, valide novamente para confirmar que a string agora está limpa e execute seu caminho de código real. Se o JSON veio de uma API, corrija na fonte se possível, em vez de corrigir a string no lado do cliente. Uma resposta limpa supera uma cadeia defensiva de .replace() todas as vezes.

Prevenindo o Erro Antes que Aconteça#

A maioria desses erros pode ser evitada com alguns hábitos. O objetivo é nunca escrever JSON manualmente quando suas ferramentas podem gerá-lo corretamente.

  • Nunca construa JSON por concatenação de strings. Use JSON.stringify() para que as aspas e vírgulas estejam sempre corretas. Se você não tem certeza de como a saída deve ser, nosso guia sobre como formatar JSON em JavaScript aborda JSON.stringify e suas arestas.
  • Sempre registre a resposta bruta antes de fazer o parse de um resultado de API, para que um < (HTML) apareça imediatamente em vez de um erro misterioso de token.
  • Verifique o status HTTP primeiro. Se res.ok for falso, leia como texto e exiba a página de erro em vez de fazer o parse cegamente.
  • Salve arquivos de configuração como UTF-8 sem BOM e mantenha um formatador no seu fluxo de trabalho diário. Se você vive em JSON, veja por que o formatador JSON é uma ferramenta diária para desenvolvedores para capturar esses problemas antes de enviá-los.
  • Valide seu JSON no CI. Um esquema ou uma etapa simples de parse no seu pipeline detecta uma vírgula à direita antes que ela chegue à produção.

Conclusão: Leia a Posição e Identifique a Causa#

Um erro de token inesperado em JSON parece aleatório até você perceber que é um dos seis problemas previsíveis, e o analisador já lhe disse onde procurar. Comece pela posição ou linha e coluna, depois associe o caractere com falha à causa: < significa HTML, uma vírgula antes de } indica vírgula à direita, um ' significa aspas simples, e um erro na posição 0 em um JSON aparentemente perfeito quase sempre indica um BOM oculto.

Quando quiser parar de apertar os olhos para deslocamentos de bytes, cole a string em um validador que destaque a linha exata e mostre o que era esperado. Esse único passo substitui a maior parte da busca manual e permite que você volte a construir.

Perguntas Frequentes#

O que significa "Unexpected token < in JSON at position 0"? Significa que a resposta que você tentou analisar começa com um <, que é a abertura de uma tag HTML, não JSON. Seu código esperava JSON, mas o servidor retornou uma página HTML, geralmente uma página de erro 404 ou 500, um redirecionamento de login ou a URL errada. Registre o texto bruto da resposta e verifique o código de status para confirmar.

Por que meu JSON aparentemente válido lança um erro na posição 0? A causa mais comum é uma marca de ordem de byte (BOM) invisível, um caractere oculto U+FEFF que alguns editores e shells do Windows adicionam a arquivos UTF-8. O JSON parece perfeito, mas o analisador lê o BOM primeiro e o rejeita. Remova-o com text.replace(/^/, "") ou salve o arquivo como UTF-8 sem BOM.

Vírgulas finais são permitidas em JSON? Não. Uma vírgula após o último item em um objeto ou array é inválida em JSON, embora literais de objeto JavaScript permitam. Esta é uma das causas mais frequentes de erros de token inesperado. Remova a vírgula que está diretamente antes de qualquer } ou ].

Posso usar aspas simples em JSON? Não. JSON exige aspas duplas para cada chave e cada valor de string. Aspas simples são válidas em JavaScript, mas não em JSON, então { 'nome': 'Ada' } lançará um erro, enquanto { "nome": "Ada" } é analisado corretamente.

Como encontro a linha exata que causa o erro JSON? Leia a posição ou linha e coluna da mensagem de erro primeiro, pois o analisador informa onde falhou. Fatia a string bruta em torno dessa posição para ver o contexto, ou cole a string inteira no formatador e validador JSON para destacar a linha com falha e mostrar qual caractere era esperado ali.

JSON suporta comentários? JSON puro não suporta comentários de nenhum tipo, então // e /* */ causarão um erro de token inesperado. Se você precisar de configuração comentada, use JSON5 ou JSONC (o dialeto que o VS Code usa para suas configurações) e analise-o com uma biblioteca que entenda esses formatos, em vez de JSON.parse.

jsondebuggingerror-fixdeveloper-tools

More from Molixa

Try Molixa Tools

50+ free AI tools for content creation, SEO, coding, and more. No signup, no watermark.

Explore all tools