Formatar JSON parece a coisa mais simples que uma ferramenta pode fazer:
adicionar espacos e quebras de linha para que um humano possa ler. A
maioria dos formatadores faz exatamente isso chamando JSON.parse e depois
JSON.stringify com um argumento de indentacao. Essa viagem de ida e volta
funciona para o JSON que voce escreve a mao e quebra silenciosamente no
JSON que voce recebe de outro lugar.
Os dois bugs que a viagem de ida e volta causa
JSON.parse transforma cada numero em um double JavaScript. Um double nao
consegue conter cada inteiro exatamente apos Number.MAX_SAFE_INTEGER, que
e 9007199254740991. Um ID snowflake, uma chave primaria de banco de dados,
ou um timestamp em nanosegundos pode facilmente exceder isso, e quando
excede, re-serializar o valor analisado altera os digitos.
12345678901234567890 volta como 12345678901234567000. Ninguem percebe
ate que o ID esteja errado em algum lugar a montante.
Essa mesma viagem de ida e volta tambem reordena chaves de objeto que
parecem numeros, ja que JSON.stringify percorre as chaves enumeraveis
proprietais de um objeto JavaScript em uma ordem especifica: chaves do
tipo inteiro primeiro, em ordem crescente, depois todo o resto em ordem
de insercao. Um documento escrito como {"2": "b", "1": "a"} volta como
{"1": "a", "2": "b"}, que e um documento diferente mesmo que cada valor
tenha sobrevivido.
O que o formatador de JSON faz ao inves
Esta ferramenta nunca chama JSON.parse. Ela tokeniza seu documento, valida
o fluxo de tokens contra RFC 8259, e reimprime a partir desses tokens. Um
numero e copiado como os caracteres exatos que voce escreveu, nao
re-encodado via um double. Uma chave fica onde voce a colocou. Colando
{"2":"second","1":"first","id":12345678901234567890,"note":"line1\nline2"}
e pressionando Formatar retorna:
{
"2": "second",
"1": "first",
"id": 12345678901234567890,
"note": "line1\nline2"
}
"2" fica antes de "1", e o id de vinte digitos volta exatamente como
escrito. Apenas o espaco em branco mudou.
Lendo uma falha
Se o documento nao e JSON valido, a ferramenta marca a linha ofensiva no gutter e nomeia o erro real ao inves de citar o token no qual empacou. Uma virgula final antes de uma chave de fechamento e reportada como uma virgula final, na linha onde a virgula esta, no final do arquivo onde um analista basico desiste.
Formatar vs Minificar
Ambos os botoes fazem a mesma reimpressao a partir de tokens; apenas o espaco em branco difere. Formatar adiciona quebras de linha e a largura de indentacao que voce escolheu (2 espacos, 4 espacos, ou uma tabulacao). Minifica elimina cada espaco, tabulacao e quebra de linha que JSON nao precisa. Nenhum altera um valor, entao e seguro pressionar qualquer um quantas vezes quiser, ou alternar entre eles sem colar novamente.
Experimente em um documento com um ID longo ou um arquivo de configuracao
com chaves numericas, e compare o resultado com um formatador que passa
por JSON.parse. A diferenca aparece imediatamente.