Ajuda técnica
Por que JSON.parse diz "Unexpected token"?
JSON.parse lança Unexpected token quando o texto não é JSON válido. Depure aspas simples, vírgula no fim, respostas HTML e a posição do erro.
JSON.parse() lança um SyntaxError quando a entrada não é JSON válido. “Unexpected token” em geral significa que o parser chegou a um caractere não permitido naquele ponto da estrutura.
Causas comuns: aspas simples, vírgula no fim, nomes de propriedade sem aspas, escape de string ruim, texto extra em volta do JSON, ou analisar HTML ou outro corpo que não é JSON como se fosse JSON.
O texto exato do erro varia conforme o motor JavaScript e o navegador. Não presuma que todo runtime imprime “Unexpected token X in JSON at position N”.
Isto é diagnóstico de Unexpected token no JSON.parse: o que o erro significa, como ler a posição e o que fazer quando o corpo é HTML. Vírgula no fim, aspas e Unexpected end têm cobertura mais ampla em Erros JSON comuns: vírgula final, aspas e Unexpected token.
O que “Unexpected token” significa em JSON.parse()?
JSON.parse() exige a gramática JSON. Um caractere ilegal na posição atual lança SyntaxError. {“name”:“Alex”,} é inválido: depois daquela vírgula o objeto não pode terminar. A mensagem e a posição ainda variam conforme o runtime.
Qual erro o JSON.parse() lança?
JSON inválido em geral lança SyntaxError. Registre error.name para confirmar o tipo. Não fixe o error.message completo: motores e versões redigem de formas diferentes.
try {
JSON.parse('{"name":"Alex",}');
} catch (error) {
console.log(error.name);
// SyntaxError
}
1. Usar aspas simples em vez de aspas duplas
{‘name’:‘Alex’} é JSON inválido. {“name”:“Alex”} é válido. Strings JSON e nomes de membro de objeto usam aspas duplas. Um literal de objeto JavaScript como const user = { name: ‘Alex’ } pode ser JavaScript legal e ainda assim não ser texto JSON.
Inválido
{'name':'Alex'}
Válido
{"name":"Alex"}
2. Vírgula no fim
Uma vírgula depois da última propriedade ou do último item de array não é JSON padrão válido. {“name”:“Alex”,“age”:30,} e [1, 2, 3,] falham. Trate isso como uma causa de Unexpected token; Erros JSON comuns: vírgula final, aspas e Unexpected token cobre vírgula no fim com mais profundidade.
Inválido
{
"name": "Alex",
"age": 30,
}
Válido
{
"name": "Alex",
"age": 30
}
[1, 2, 3,]
3. Nomes de propriedade sem aspas
{ name: “Alex” } pode ser um literal de objeto JavaScript. Em JSON, nomes de membro são strings e precisam de aspas duplas: {“name”:“Alex”}.
Inválido
{
name: "Alex"
}
Válido
{
"name": "Alex"
}
4. Escape de string inválido
No texto JSON uma barra invertida inicia um escape. Um caminho cru como C:\Users\Alex é inválido porque \U não é um escape legal. Dobre as barras invertidas. Não misture o escape da linguagem hospedeira com o escape JSON. Erros JSON comuns: vírgula final, aspas e Unexpected token cobre isso com mais profundidade.
Inválido
{"file":"C:\Users\Alex"}
Válido
{"file":"C:\\Users\\Alex"}
5. Texto extra antes ou depois do JSON
JSON.parse espera um único valor JSON. Um prefixo como Success: antes de {“ok”:true}, ou um sufixo como done depois, deixa a string inteira inválida. Espaço em branco insignificante em volta de um único valor JSON é permitido. JSON não proíbe espaços antes ou depois do valor.
Success:
{"ok":true}
{"ok":true}
done
6. Analisar HTML em vez de JSON
Chamar response.json() em uma página HTML é um caso comum de Unexpected token. Endpoints errados, páginas HTML 404 ou 500, redirecionamentos de login, corpos de proxy e páginas de fallback costumam começar com marcação. “Unexpected token < always means HTML” é forte demais: < é um indício, não prova.
fetch('/api/data')
.then(response => response.json())
O que “Unexpected token <” costuma significar?
Valores JSON normalmente não começam com <. Se o corpo começa com ou , < pode ser o primeiro caractere ilegal. Na depuração local, confira o status HTTP, Content-Type e o corpo bruto. A redação do motor ainda varia.
Confira a resposta antes de analisá-la
O corpo de fetch só pode ser consumido uma vez. Na depuração local, leia text() primeiro, inspecione um prefixo curto e então faça JSON.parse nessa mesma string. Não chame response.json() e depois response.text() na mesma resposta. Não registre por padrão cargas sensíveis de produção.
const response = await fetch(url);
const text = await response.text();
console.log(response.status);
console.log(response.headers.get("content-type"));
console.log(text.slice(0, 200));
try {
const data = JSON.parse(text);
console.log(data);
} catch (error) {
console.error("Invalid JSON:", error);
}
O que significa “at position 123”?
Alguns motores informam uma posição, linha ou coluna. Olhe perto uma aspa, vírgula, chave ou escape ruim. Esse índice é onde a análise notou um problema; a causa real pode estar antes. Não é garantido que seja o caractere defeituoso exato.
Unexpected token versus Unexpected end
Unexpected token significa que o parser encontrou um caractere que não esperava. Unexpected end pode aparecer quando a entrada para antes de o valor ficar completo, como em {“name”:“Alex” sem chave de fechamento. A redação exata depende do motor. Erros JSON comuns: vírgula final, aspas e Unexpected token cobre JSON incompleto de forma mais ampla.
{"name":"Alex"
JSON não é o mesmo que um literal de objeto JavaScript
JSON é um formato de dados. Um literal de objeto JavaScript é sintaxe JavaScript. O objeto JS com chaves sem aspas, aspas simples e vírgula no fim não é texto JSON válido. JSON.parse não consegue analisar com segurança literais de objeto JavaScript.
const data = {
name: 'Alex',
active: true,
};
{
"name": "Alex",
"active": true
}
JSON pode conter comentários?
JSON padrão não admite comentários. Uma linha // dentro de um objeto é inválida. JSON5 e extensões parecidas são formatos diferentes. Formatar e comparar JSON valida JSON padrão com JSON.parse e não trata JSON5 como JSON.
{
// user name
"name": "Alex"
}
undefined, NaN e Infinity são JSON válido?
Não. Valores JSON são objeto, array, string, número, true, false e null. undefined, NaN e Infinity não são. Um valor de topo não precisa ser objeto ou array: true, 123, “hello” e null são JSON válido.
{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null
Como corrigir um erro Unexpected token passo a passo
Trabalhe a fonte, não a string do erro:
- Confirme que a entrada é de fato JSON, não HTML, logs ou JavaScript.
- Inspecione os primeiros caracteres da entrada bruta.
- Se veio de uma API, confira o status HTTP e Content-Type. Nem 200 nem application/json garantem JSON válido.
- Valide a sintaxe em um parser JSON.
- Use qualquer posição, linha ou coluna relatada como indício, não como a causa raiz garantida.
- Confira aspas, vírgulas, chaves, colchetes e escapes perto dessa área.
- Compare com uma cópia formatada e validada.
- Corrija o serializador ou o endpoint. Não apague o token relatado ao acaso.
Uma substituição global de ' por " pode quebrar apóstrofos dentro de strings, texto já escapado e fontes que não são JSON. Produza JSON válido a partir do serializador real. Não trate eval como um parser JSON.
Use JSON.stringify() ao produzir JSON em JavaScript
Prefira JSON.stringify a concatenar strings na mão. Ele emite texto JSON válido para os valores que serializa. Não preserva todo valor JavaScript: undefined, funções e symbols têm comportamento especial. Esse detalhe fica fora do escopo aqui.
const data = {
name: "Alex",
active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}
JSON inválido versus um conserto real
Estes pares foram checados com JSON.parse. Para HTML, o conserto é a resposta, não uma edição de sintaxe.
| Problema | Inválido | Conserto |
|---|---|---|
| Aspas simples | {'a':1} |
{"a":1} |
| Vírgula no fim | {"a":1,} |
{"a":1} |
| Chave sem aspas | {a:1} |
{"a":1} |
| undefined | {"a":undefined} |
{"a":null} |
| Corpo HTML | <html>... |
Confira o endpoint e a resposta bruta. Não edite HTML para virar JSON. |
Um guia simples de decisão para Unexpected token
Se JSON.parse falhou, decida se você sequer tem JSON antes de reescrever aspas.
- JSON.parse falhou
- De uma API? Confira status, Content-Type e o corpo bruto
- Começa como JSON? Se não, corrija a fonte ou o endpoint
- Se sim, valide aspas, vírgulas, chaves, colchetes, escapes, valores não suportados
- Use a posição relatada como indício
- Corrija a fonte e analise de novo
Valide JSON antes de analisar ou usar
NEXNARA Formatar e comparar JSON valida JSON no navegador com JSON.parse—não eval.
Valide, formate com 2 espaços, 4 espaços ou tabs, minifique, copie, baixe e envie .json. JSON Diff cobre objetos e arrays aninhados, caminhos, resumo, filtros e troca. Depois do parse, cópias formatada e minificada dos mesmos dados comparam como iguais; chaves de objeto são comparadas pelo nome.
Texto maior que 5 MB pode ficar lento. Texto maior que 15 MB não é processado no navegador.
A validação e a formatação de JSON acontecem no seu navegador. Esta ferramenta não envia o JSON a um servidor da NEXNARA. Anúncios e outros recursos do site ainda usam a rede.
Cole a string que falha em Formatar e comparar JSON e leia os primeiros caracteres antes de reescrever aspas.
FAQ
Por que JSON.parse diz Unexpected token?
O texto não é JSON válido no ponto em que o parser parou. Causas típicas: aspas, vírgulas, texto extra ou um corpo que não é JSON, como HTML.
O que significa Unexpected token < in JSON?
O primeiro caractere ilegal pode ser <. Isso costuma apontar para uma página HTML, mas não é prova de 404 nem de HTML em todos os casos. Confira status, Content-Type e o corpo bruto.
Como acho a posição do erro em JSON?
Se o motor relata uma posição, linha ou coluna, olhe perto. O erro real pode estar antes. Use como indício e depois valide.
JSON pode usar aspas simples?
Não. No JSON padrão, strings e nomes de membro usam aspas duplas.
JSON pode ter vírgula no fim?
Não. O JSON padrão não permite vírgula depois da última propriedade ou do último item de array.
Como conferir se uma string é JSON válido?
Chame JSON.parse num try/catch, ou cole o texto em Formatar e comparar JSON. Se a análise lançar SyntaxError, a string não é JSON válido.