← Todos os artigos

Vírgula final em JSON: por que { "a": 1, } lança erro

Uma única vírgula a mais depois do último item em um objeto ou array JSON causa SyntaxError. Aprenda por que JSON proíbe vírgulas finais, de onde elas vêm e como removê-las.

Você escreve o que parece JSON perfeitamente razoável —— toda key com aspas, todo valor válido —— e o JSON.parse() ainda assim lança um SyntaxError. O culpado é quase sempre uma vírgula no final: aquela , extra que fica depois do último item num objeto ou array. Aqui está por que o JSON proíbe ela, por onde ela se infiltra, e como se livrar dela.

O que é uma vírgula no final?

Uma vírgula no final (também chamada de «vírgula pendurada» ou «vírgula terminal») é uma vírgula que aparece depois do último item numa lista —— sem nada depois dela antes do colchete de fechamento.

// Vírgula no final num objeto
{
  "name": "Ada",
  "score": 98,   // ← essa vírgula não tem próximo item
}

// Vírgula no final num array
[1, 2, 3,]
//       ^ mesmo problema

Os dois exemplos acima vão lançar um SyntaxError quando passados pro JSON.parse().

Por que o JSON proíbe vírgulas no final?

A gramática JSON (definida na RFC 8259) especifica que a vírgula é um separador entre elementos —— ela sempre tem que ter um valor dos dois lados. A regra formal pra um objeto JSON parece assim:

object = "{" [ member *( "," member ) ] "}"
member = string ":" value

Uma vírgula precisa ser seguida por outro member. Se não tiver nada depois da vírgula, a gramática é inválida. Isso foi uma escolha de design deliberada: o JSON prioriza simplicidade e parsing sem ambiguidade sobre conveniência pro desenvolvedor.

JavaScript seguiu outro caminho. ES5 (2009) explicitamente tornou legais as vírgulas no final em literais de array, e ES2017 estendeu pra parâmetros de função. Vírgulas no final em JS agora são estilo comum —— muitos linters até exigem porque produzem diffs git mais limpos quando você adiciona um novo item a uma lista.

O gap entre o que o JavaScript permite e o que o JSON permite é a raiz de quase todo erro de vírgula no final que você vai ver.

De onde vêm as vírgulas no final

Arquivos de config editados à mão

Arquivos de config tipo tsconfig.json, package.json, ou settings de app são editados por humanos. Depois de adicionar ou remover uma entrada, é fácil deixar uma vírgula perdida. Muitos editores (VS Code, WebStorm) silenciosamente aceitam JSONC (JSON-with-Comments) que permite vírgulas no final, então o arquivo parece ok no editor mas quebra em runtime.

// Você apagou "debug": true mas esqueceu de tirar a vírgula
{
  "compilerOptions": {
    "strict": true,
    "target": "ES2020",   // ← agora virou final
  }
}

Serialização JavaScript → JSON

Desenvolvedores às vezes constroem uma string JSON manualmente interpolando valores JavaScript, ou usando Array.join(','). Se a lógica adiciona uma vírgula depois de cada item incondicionalmente, o último item ganha uma vírgula no final.

// ❌ serialização manual ingênua
const parts = items.map(item => `"${item.name}": ${item.value}`);
const json = '{' + parts.join(',') + ',}'; // vírgula extra antes de }

// ✅ use JSON.stringify —— sempre produz JSON válido
const json = JSON.stringify(Object.fromEntries(items.map(i => [i.name, i.value])));

Saída de LLM e IA

Modelos de linguagem pedidos pra «sair JSON» frequentemente produzem vírgulas no final. O modelo viu enormes quantidades de código JavaScript durante o treino onde vírgulas no final são legais, então replica o padrão. Sempre valide ou conserte JSON gerado por IA antes de parsear.

Copia-cola de código JavaScript

Copiar um literal de objeto de um arquivo .js ou .ts e colar num contexto JSON é uma das formas mais comuns de aparecerem vírgulas no final. O código fonte era JavaScript válido; o destino só aceita JSON.

Como achar a vírgula no final

A mensagem de erro geralmente te aponta pra perto do problema, mas nem sempre exatamente pra vírgula em si —— o parser só nota que algo está errado quando bate no } ou ] inesperado:

SyntaxError: Expected double-quoted property name in JSON at position 58
// ou
SyntaxError: Unexpected token '}', ..."score": 98,}" is not valid JSON

Trabalhe de trás pra frente a partir da posição reportada. A vírgula no final é o caractere imediatamente antes do colchete de fechamento que disparou o erro.

Pra arquivos JSON grandes, uma busca regex ajuda:

// Achar vírgulas no final em objetos/arrays
,\s*[}\]]

Como consertar

Opção 1 —— Apagar manualmente

Ache o último item no objeto ou array problemático e tire a vírgula depois dele. Pra arquivos pequenos essa é a abordagem mais rápida.

Opção 2 —— Usar substituição com regex (cuidado)

const fixed = raw.replace(/,\s*([}\]])/g, '$1');
JSON.parse(fixed);

Funciona pro caso comum, mas é frágil: pode corromper strings que contenham ,} ou ,] como caracteres literais. Use só quando você sabe que a entrada não contém tais strings.

Opção 3 —— Usar um parser de reparo apropriado

Um parser de reparo entende a gramática JSON completa e remove vírgulas no final só nas posições estruturais onde são inválidas, sem tocar no conteúdo de string. Essa é a abordagem mais segura pra código de produção ou input não confiável.

Opção 4 —— Mudar pra JSONC em arquivos de config

Se as vírgulas no final estão num arquivo de config que você controla, considere mudar pra um parser que suporte JSONC (JSON com comentários). O tsconfig.json do TypeScript já usa JSONC. Pra arquivos de config Node.js, libs tipo @humanwhocodes/momoa ou json5 parseiam um superconjunto de JSON que permite vírgulas no final e comentários.

Quando vírgulas no final são realmente permitidas: JSONC e JSON5

Dois formatos adjacentes ao JSON deliberadamente permitem vírgulas no final (e outras flexibilizações), e valem ser reconhecidos:

  • JSONC (JSON com comentários) —— usado por tsconfig.json, o settings.json do VS Code, e muitos outros configs de desenvolvedor. JSONC permite comentários // / /* */ e vírgulas no final. O arquivo ainda se chama .json, mas o JSON.parse() padrão rejeita —— o VS Code e tooling embarcam parsers que entendem JSONC.
  • JSON5 —— um superconjunto mais completo: comentários, vírgulas no final, keys sem aspas, aspas simples, strings multilinha, números hex. Adote com o pacote npm json5 ou pyjson5 em Python. Use onde humanos editam dado à mão e você controla o parser; não envie por API pra clientes que esperam JSON estrito.

Regra geral: mantenha vírgulas no final fora de tudo que cruza um parser JSON estrito (respostas de API, request bodies, arquivos consumidos por libs aleatórias), e abrace dentro de JSONC/JSON5 só onde o consumidor sabe.

Prevenindo vírgulas no final

  • Nunca construa strings JSON manualmente. Use JSON.stringify() —— sempre produz saída conforme spec.
  • Adicione uma regra de linter. A regra jsonc/no-trailing-commas do ESLint pega vírgulas no final em arquivos .json ao salvar.
  • Valide a saída de IA. Sempre rode JSON.parse() (ou um parser de reparo) em qualquer coisa que um modelo de linguagem gere antes de usar.
  • Use Prettier. O Prettier reformata arquivos JSON e remove vírgulas no final automaticamente ao salvar.

Perguntas frequentes

JSON permite vírgulas no final?

Não. A gramática JSON na RFC 8259 define vírgula estritamente como um separador entre dois valores, então uma vírgula com nada depois antes do } ou ] de fechamento é inválida. Todo parser padrão —— JSON.parse(), o módulo json do Python, o encoding/json do Go —— rejeita.

Como removo uma vírgula no final do JSON?

Pra um arquivo, apague a vírgula depois do último item manualmente. Pra correções repetidas ou programáticas, use JSON.stringify() pra regenerar o JSON, um parser de reparo, ou uma ferramenta tipo JSON Fix que tira vírgulas no final estruturais sem tocar no conteúdo de string.

Por que JavaScript permite vírgulas no final mas JSON não?

JavaScript adicionou vírgulas no final em ES5 (arrays) e ES2017 (parâmetros de função) como feature de conveniência pro desenvolvedor que produz diffs git mais limpos. JSON é um formato de troca deliberadamente mínimo que prioriza parsing sem ambiguidade sobre conveniência, então nunca adotou. Veja JSON vs objetos JavaScript pra lista completa de diferenças.

Que erro uma vírgula no final causa?

Normalmente SyntaxError: Unexpected token '}' ou Expected double-quoted property name in JSON, porque o parser espera outro valor depois da vírgula e em vez disso encontra o colchete de fechamento. Essa é uma variante dos mais amplos erros «Unexpected token» do JSON.parse.

Conserte agora —— sem instalação

Se você tem uma string JSON com vírgulas no final que precisa consertar imediatamente, o JSON Fix remove elas automaticamente junto com qualquer outro problema comum —— aspas simples, keys sem aspas, literais Python, comentários JavaScript. Cole seu JSON, clique Repair & Format, e copie JSON limpo de volta. Sem conta, sem upload, nenhum dado sai do seu navegador.