Erros comuns em JSON e como corrigi-los

Atualizado:

O JSON é o formato que muitas APIs, arquivos de configuração e aplicativos web usam para trocar dados, e a gramática dele cabe em uma única página. É também por isso que ele não perdoa: um texto ou é JSON válido ou não é, e uma única vírgula fora do lugar basta para que um parser rejeite tudo. A maioria dos erros vem dos mesmos poucos hábitos, muitos deles trazidos do JavaScript ou de outras linguagens. Este guia lista as regras, os erros que mais as violam, como ler a mensagem de erro e alguns casos que são JSON válido, mas ainda causam problemas.

As regras que o JSON realmente tem

As definições atuais são a RFC 8259, publicada em dezembro de 2017, e a ECMA-404. As duas descrevem a mesma sintaxe:

Entre os tokens, só quatro caracteres de espaço em branco são permitidos: espaço, tabulação, avanço de linha e retorno de carro.

Os erros mais comuns

Cada um destes é rejeitado por um parser padrão. A correção está na descrição.

Formatador e conversor JSON

Lendo a mensagem de erro

O parser lê o texto da esquerda para a direita e para no primeiro caractere que não consegue aceitar; por isso, a posição na mensagem de erro é onde ele desistiu, o que muitas vezes fica logo depois do erro de verdade. Com uma vírgula no final, o parser reclama da chave de fechamento, porque depois de uma vírgula ele espera outro nome de propriedade. Com uma chave ou um colchete faltando, o erro pode aparecer bem no fim do texto, longe do lugar em que o caractere que falta deveria estar.

O texto das mensagens varia entre navegadores e linguagens, e muitas delas indicam uma posição, embora nem todas, seja como uma contagem de caracteres desde o início, seja como linha e coluna. Por exemplo, o motor JavaScript do Chrome informa {"name":"Ana",} assim:

Quando a posição não for óbvia, olhe o caractere logo antes dela e confira se toda chave, todo colchete e toda aspa abertos antes desse ponto têm o seu par. Um editor que destaca os pares de chaves e colchetes muitas vezes torna fácil encontrar o que está faltando.

JSON válido que ainda causa problemas

JSON não é JavaScript

A sintaxe do JSON foi tirada dos literais de objeto do JavaScript, e é por isso que os dois se confundem com tanta facilidade. Um literal de objeto JavaScript aceita aspas simples, nomes sem aspas, vírgulas no final, comentários e valores como undefined; o JSON não aceita nenhum deles. Por isso, um código que funciona quando colado em um script pode falhar como arquivo JSON.

Algumas ferramentas aceitam formatos estendidos, como o JSON5 ou o “JSON com comentários” usado em arquivos de configuração. Eles são práticos onde há suporte a eles, mas não são JSON, e um parser padrão, incluindo o formatador do nTools, vai rejeitá-los.

Perguntas frequentes

O JSON pode ter comentários?

Não. A especificação não tem sintaxe de comentário. Se você precisar de observações nos dados, coloque-as em uma propriedade como "_comment" ou use um formato que permita comentários, onde as ferramentas derem suporte a ele.

Por que meu JSON funciona no JavaScript, mas falha em um validador?

Porque um literal de objeto JavaScript permite coisas que o JSON não permite, como aspas simples, vírgulas no final e nomes sem aspas. Colado em um código, ele roda; salvo como JSON, é inválido.

Como mantenho exato um número muito grande?

Envie-o como string, por exemplo "9007199254740993", e converta-o no lado que recebe com um tipo capaz de representá-lo, como o BigInt, em JavaScript.

O formatador do nTools envia meu JSON para algum lugar?

Não. Ele é analisado e formatado no seu navegador e, quando o navegador informa uma posição, o formatador a mostra como linha e coluna.

Guias relacionados