O Erro de Sintaxe Neste Exemplo
A entrada anterior é quase JSON válido. O problema é a vírgula final depois de false no segundo objeto de usuário:
{"name": "Bob", "active": false,}
Remova essa vírgula é o documento se torna válido:
{
"users": [
{"name": "Alice", "active": true},
{"name": "Bob", "active": false}
]
}
Este é o erro JSON mais comum que desenvolvedores enfrentam, e é fácil não perceber porque JavaScript o tolera.
O Que Torna o JSON Válido
A sintaxe JSON é definida pela RFC 8259. As regras são mais simples do que a maioria espera. Um documento JSON válido é um de: um objeto, um array, uma string, um número, um booleano (true ou false) ou null. Objetos são coleções de pares chave-valor. Chaves devem ser strings (com aspas duplas). Valores podem ser qualquer valor JSON. Arrays são listas ordenadas de valores JSON.
Regras estruturais que mais pegam os desenvolvedores:
Vírgulas finais
O último elemento de um array ou o último par chave-valor de um objeto não deve ter vírgula final. [1, 2, 3,] é inválido. {"a": 1, "b": 2,} é inválido.
Aspas em strings
Todas as strings devem usar aspas duplas. 'Alice' não é JSON válido. "Alice" é.
Aspas em chaves
Chaves de objeto devem ser strings com aspas. {name: "Alice"} não é JSON. {"name": "Alice"} é.
Sem comentários
JSON não tem sintaxe de comentários. // comentário e /* comentário */ causam erro de análise. Issó surpreende quem vem de linguagens que suportam comentários em arquivos de configuração.
Valores float especiais
NaN, Infinity e -Infinity não são valores JSON válidos. Se você tentar serializar NaN para JSON com JSON.stringify(), obtém null. O json.dumps() do Python lança ValueError por padrão.
Os 5 Erros de Sintaxe JSON Mais Comuns
| Erro | Exemplo | Correção |
|---|---|---|
| Vírgula final | {"a": 1,} | {"a": 1} |
| Strings com aspas simples | {'key': 'value'} | {"key": "value"} |
| Chaves sem aspas | {key: "value"} | {"key": "value"} |
| Comentários | {"a": 1 // nota} | Remova comentários |
| NaN ou undefined | {"val": NaN} | Substitua por null |
Validando JSON na Linha de Comando
Para válidação rápida sem navegador, jq é a ferramenta padrão. Ele sai com código não zero se a entrada for JSON inválido, o que o torna útil em scripts.
Validar um arquivo:
jq . file.json
Validar uma string:
echo '{"name": "Alice",}' | jq .
# parse error (Expected another key-value pair or '}')
A biblioteca padrão do Python também válida sem dependências:
python3 -m json.tool file.json
Para pipelines de CI, ambas as ferramentas funcionam como etapas de válidação que falham ruidosamente em entrada malformada.
JSON vs JSONC vs JSON5
| Formato | Comentários | Vírgulas finais | Aspas simples | Casó de usó |
|---|---|---|---|---|
| JSON | Não | Não | Não | Troca de dados, APIs |
| JSONC | Sim | Sim | Não | Arquivos de config (VS Code) |
| JSON5 | Sim | Sim | Sim | Arquivos de config (Babel, ESLint) |
Se você está construindo uma API ou escrevendo dados que serão analisados por uma biblioteca, use JSON estrito. Se você está escrevendo um arquivo de configuração que uma ferramenta específica lê, verifique qual formato essa ferramenta espera. Misturá-los é uma fonte comum de falhas silenciosas quando arquivos de configuração são passados para analisadores padrão.
A Especificação
RFC 8259 é a especificação JSON atual, publicada em 2017. Ela substituiu a RFC 7159. A especificação é legível em cerca de 20 minutos e vale a pena folhear uma vez. Define a gramática formalmente, cobre precisão numérica e específica a codificação UTF-8. Um ponto chave da especificação: um analisador JSON pode aceitar ou rejeitar chaves duplicadas em um objeto. A maioria dos analisadores as aceita e usa o último valor, mas o comportamento é indefinido e você não deve confiar nisso.