Pular para o conteudo principal
CuteJSON
↑↓ Navegar Enter Selecionar Esc Fechar

Como formatar JSON sem perder precisao

Publicado 2 min de leitura Por Akash Kinkar Pandey

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.

Voltar a todos os posts