[Ferramentas para desenvolvedores]•6 min de leitura
Cinco motivos para o JSON falhar no parse e a armadilha dos números grandes
1. JSON é mais rigoroso do que parece
JSON se parece com um literal de objeto JavaScript, mas permite muito menos. Ele é definido pela RFC 8259 e pela ECMA-404, e muita coisa válida em JavaScript é inválida em JSON.
2. Cinco motivos para o parse falhar
① Vírgula final
{"a": 1, "b": 2,} — uma vírgula depois do último membro é erro. JavaScript aceita; JSON não.② Chaves sem aspas
{a: 1} — as chaves precisam ser strings entre aspas duplas.③ Aspas simples
{'a': 'b'} — JSON só reconhece aspas duplas.④ Comentários
Nem
// nota nem /* */ existem no JSON padrão. Arquivos de configuração que precisam de comentários devem usar uma extensão como JSONC ou JSON5.⑤ Valores especiais
NaN, Infinity e undefined não são JSON. Represente um número ausente como null ou como string.Outro erro comum é uma quebra de linha literal dentro de uma string; ela precisa ser escapada como
\n.3. Lendo a posição do erro
Os parsers costumam informar algo como "position 42", mas a causa real geralmente está antes. Uma única aspa faltando faz o parser engolir o resto do documento como parte de uma string até falhar muito depois.
Passar o documento por um formatador para expandir a estrutura torna fácil enxergar o aninhamento desencontrado.
4. A armadilha dos números grandes
Isso não é um erro de sintaxe, e sim uma mudança silenciosa de valor, o que o torna mais perigoso.
Os números do JavaScript são pontos flutuantes de precisão dupla, então os inteiros só são representados com exatidão até:
Number.MAX_SAFE_INTEGER = 9007199254740991Fazer o parse de um inteiro maior com
JSON.parse altera o valor sem aviso. Por exemplo, 12345678901234567890 vira 12345678901234567000, sem erro e sem alerta.Quando isso pega você
A solução
O remédio padrão é o servidor serializar esses valores como strings:
{"id": "12345678901234567890"}. Se o cliente precisar tratá-los como números, use BigInt com um reviver personalizado.5. Variantes de JSON
| Formato | Diferença | Usado em |
|---|---|---|
| JSON | O padrão | Respostas de API, troca de dados |
| JSONC | Permite comentários | Configurações do VS Code e similares |
| JSON5 | Comentários, vírgulas finais, aspas simples | Arquivos de configuração escritos à mão |
| NDJSON / JSON Lines | Um valor JSON por linha | Logs, streaming, processamento em lote |
Não retorne JSONC de uma API só porque funciona em um arquivo de configuração; parsers padrão vão rejeitá-lo.
6. Uma observação de segurança
Ainda aparece de vez em quando código que passa uma string JSON por
eval(). Nunca faça isso. Uma entrada não confiável que contenha código será executada como código. JSON.parse é seguro.7. Ferramenta
O Formatador de JSON EVEDAYS valida e formata dentro do seu navegador. Respostas de API frequentemente contêm dados pessoais ou tokens, então uma ferramenta que nunca os transmite é a escolha mais segura.