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

Como comparar dois documentos JSON pelo que eles significam, nao por como parecem

Publicado 2 min de leitura Por Akash Kinkar Pandey

Um diff de texto em JSON reporta a coisa errada com mais frequencia do que reporta a certa. Reindente um arquivo, ou mova uma propriedade de baixo para cima, e um diff baseado em linhas acende como dezenas de linhas alteradas mesmo que os dados sejam identicos. O que voce realmente quer saber e se os valores mudaram, nao se os bytes mudaram.

Usar a ferramenta de diff JSON

Cole o documento original em Antes e o alterado em Depois, depois pressione Comparar. Cada diferenca no resultado carrega o caminho do valor e ambos os lados da alteracao, entao voce esta lendo “$.b mudou de "x" para "y"” em vez de contar sinais de mais e menos.

Comparar

{"a":1,"b":"x","c":true,"nested":{"n":1.0}}

contra

{"b":"y","c":true,"d":"new","nested":{"n":1}}

reporta exatamente tres diferencas: $.a removido, $.b mudou de "x" para "y", e $.d adicionado. Mais nada. $.c e identico e nao aparece. $.nested.n tambem nao aparece, porque 1.0 e 1 significam o mesmo numero.

Como objetos e arrays sao comparados diferente, de proposito

Objetos sao tratados como nao ordenados, porque e isso que a especificacao JSON diz que sao: um conjunto de pares nome e valor sem ordem definida. Reordenar as chaves de um objeto nao e uma alteracao aqui, e uma ferramenta de diff que reportasse como tal estaria reportando sobre formatacao, nao sobre dados.

Arrays sao comparados por posicao, porque essa e a unica leitura honesta disponivel. A ferramenta nao pode saber se voce inseriu um elemento no meio de uma lista ou reescreveu cada elemento apos ele, entao ela nao adivinha. Inserir um item perto do inicio de um longo array aparecera como muitas alteracoes posicionais, o que e correto mesmo que pareca surpreendente na primeira vez.

O que conta como igual

1 e 1.0 sao o mesmo valor, e duas ortografias diferentes de um escape em uma string sao a mesma string. O unico lugar onde isso se torna estrito e inteiros longos: dois numeros de vinte digitos devem corresponder digito a digito antes de serem chamados iguais, porque um double do JavaScript nao pode representar de forma unica e um diff que tratasse silenciosamente dois IDs longos diferentes como o mesmo numero estaria ativamente errado. As tres regras sao declaradas na pagina, porque um diff que decide silenciosamente e um no qual voce nao pode agir.

Trocar lados

Se voce colou os documentos na ordem errada, Trocar lados inverte a comparacao sem reescrever nada, o que tambem inverte contra qual lado uma adicao ou remocao e reportada.

Voltar a todos os posts