JSON válido e legível

JSON é o formato em que a maioria das APIs web troca dados: objetos entre chaves com chaves de texto entre aspas duplas, arrays entre colchetes, strings, números, true, false e null. As APIs costumam devolvê-lo minificado numa linha só: formatá-lo com indentação o deixa legível, minificá-lo tira os espaços e economiza bytes.

A sintaxe é mais rígida que a do JavaScript: sem vírgula depois do último elemento, sem comentários, sem aspas simples e com as chaves sempre entre aspas duplas. São os erros mais comuns ao escrever JSON à mão, e o analisador os aponta na posição exata.

Ordenar as chaves em ordem alfabética não muda o significado, porque num objeto JSON a ordem das chaves não importa, mas facilita muito comparar duas respostas ou dois arquivos de configuração com um diff.

Erros comuns

  • Deixar uma vírgula depois do último elemento de um objeto ou array: JSON não aceita.
  • Usar aspas simples ou chaves sem aspas, como em JavaScript: JSON exige aspas duplas.
  • Escrever NaN, Infinity ou undefined: não são valores JSON; usa-se null.

Perguntas frequentes

O JSON que colo é enviado a um servidor?

Não: a formatação e a validação acontecem no navegador com JSON.parse. Só JSONs curtos vão para o endereço da página, para poder compartilhá-la.

Por que números muito grandes mudam?

JSON.parse usa os números de ponto flutuante do JavaScript, exatos até 2⁵³: um ID como 12345678901234567890 é arredondado. APIs com IDs grandes costumam enviá-los como strings.

Qual a diferença entre JSON e JSON5?

JSON5 é uma extensão que aceita comentários, vírgulas finais e aspas simples; prática para arquivos de configuração, mas não é JSON padrão e JSON.parse a rejeita.

Como funciona este cálculo

O texto é lido com JSON.parse, que aplica a gramática da RFC 8259; em caso de erro, a posição informada pelo navegador é convertida em linha e coluna. O resultado é reescrito com JSON.stringify, com 2 ou 4 espaços ou uma tabulação por nível, ou sem espaços. Com a ordenação, as chaves de cada objeto são ordenadas recursivamente por código Unicode. Os tamanhos são em bytes UTF-8.