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.

Resposta rápida

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:

  1. Confirme que a entrada é de fato JSON, não HTML, logs ou JavaScript.
  2. Inspecione os primeiros caracteres da entrada bruta.
  3. Se veio de uma API, confira o status HTTP e Content-Type. Nem 200 nem application/json garantem JSON válido.
  4. Valide a sintaxe em um parser JSON.
  5. Use qualquer posição, linha ou coluna relatada como indício, não como a causa raiz garantida.
  6. Confira aspas, vírgulas, chaves, colchetes e escapes perto dessa área.
  7. Compare com uma cópia formatada e validada.
  8. Corrija o serializador ou o endpoint. Não apague o token relatado ao acaso.
Não “consertes” JSON trocando aspas 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
Unexpected token nomeia a surpresa. A origem do texto costuma ser o conserto real.

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.