Por que uma vírgula final quebra o JSON
Resumo: Vírgulas finais são legais em literais de objeto JavaScript e fatais em JSON. Aqui está o erro exato, a gramática da RFC 8259 que o provoca e três correções que realmente funcionam.

Resumo da ópera: JSON proíbe vírgulas finais em todos os lugares — quando um analisador falha, exclua a última vírgula com um formatador; use JSON5 ou JSONC apenas para análise local leniente e sempre emita JSON padrão para outros sistemas.
Porque a gramática diz isso.
{
"name": "demo",
"size": 12,
}
JSON.parse lança Unexpected token } in JSON at position 34. O Node formula de outra maneira, mas toda engine aponta para o mesmo lugar: a vírgula antes de }.
Do que o analisador está realmente reclamando
A produção de objeto na RFC 8259 é:
object = begin-object [ member *( value-separator member ) ] end-object
Colchetes significam opcional, o asterisco significa zero ou mais. Em termos simples: vírgulas separam membros, e o último membro é seguido diretamente por }.
Então, após uma vírgula, o analisador está pronto para outro nome de membro. Ele lê } e falha. Arrays se comportam de forma idêntica — [1, 2, 3,] falha no ].
De onde vem o hábito
Literais de objeto JavaScript permitem vírgulas finais desde o ES5, assim como listas Python e literais compostos Go. Editores as adicionam automaticamente. Então alguém copia um literal de objeto de um arquivo .js para um arquivo .json e o arquivo deixa de ser analisado.
A outra origem comum é JSON montado à mão: um laço que roda i <= length deixa uma vírgula depois do elemento final.
Três correções
Remova a vírgula. Bom para edições manuais. Cole no formatador JSON e o erro é informado com linha e coluna, então você vê exatamente qual excluir.
Analise como JSON5. Superconjuntos aceitam vírgulas finais, o que é bom para configuração local. Não é bom para nada que você envia a outro sistema — o receptor ainda vai rejeitar.
Pare de concatenar strings. Use JSON.stringify, json.dumps, Jackson. O serializador trata os separadores corretamente e resolve o escape ao mesmo tempo.
Lista rápida de auditoria
| Onde | Causa típica |
|---|---|
| Concatenação em laço | i <= length deixa uma vírgula extra |
| Copiar e colar | Literal de objeto retirado de um arquivo JS |
| Templates | Vírgula codificada à mão mais um laço que adiciona outra |
| Edição manual | Último campo excluído, vírgula dele deixada para trás |
Perguntas frequentes
Por que vírgulas finais são legais em JavaScript mas não em JSON?
Literais de objeto JavaScript as permitem desde o ES5, e listas Python e literais compostos Go também, o que explica por que o hábito segue as pessoas para o JSON. A RFC 8259 permite vírgulas apenas entre membros: o último membro é seguido diretamente por } ou ]. Copiar um literal de objeto de um arquivo .js para um .json é a origem usual.
Devo analisar como JSON5 para aceitar vírgulas finais?
Apenas para configuração local. Superconjuntos aceitam vírgulas finais, mas nada que você envia a outro sistema é analisado como JSON estrito e ainda vai falhar. Gere JSON padrão na fronteira de saída em vez de contar com a leniência do receptor.
Onde devo olhar primeiro após um erro de vírgula final?
Comece pela posição na mensagem de erro: ela normalmente aponta para a vírgula antes de } ou ]. Depois verifique as três origens usuais: um laço escrito com i <= length, um literal de objeto colado de um arquivo JS e um template que codifica uma vírgula junto com um laço. Colar em um formatador informa a linha e a coluna exatas.