Comparador de JSON: encontre as diferenças estruturais
Compare dois JSON por estrutura e valor, não como texto. Veja cada diferença como ADICIONADO, REMOVIDO ou ALTERADO com o caminho exato até a folha.
Cole dois documentos JSON e veja exatamente onde eles divergem. A comparação é estrutural: o comparador percorre a árvore de dados em profundidade e avalia forma e valor, então chaves de objeto em ordem diferente ou indentação diferente não contam como divergência — nesses casos o resultado é "estruturalmente idêntico". Cada diferença encontrada nas folhas aparece classificada como ADICIONADO, REMOVIDO ou ALTERADO, acompanhada do caminho que leva até ela, no formato x.y[1]. É a forma prática de revisar uma resposta de API antes e depois de uma mudança, ou de conferir dois arquivos de configuração que deveriam ser equivalentes.
O que é uma comparação estrutural de JSON?
Uma comparação estrutural analisa o JSON já interpretado como dados, e não como sequência de caracteres. Um diff de texto comum aponta linhas diferentes sempre que a formatação muda; a comparação estrutural ignora espaços, quebras de linha e a ordem das chaves de um objeto, porque nada disso altera o significado do documento. O que importa são as chaves presentes, as posições dos itens de array e os valores das folhas — e é exatamente isso que fica registrado no relatório de diferenças.
Como funciona a comparação de JSON
Os dois lados são analisados com JSON.parse e depois percorridos em profundidade em paralelo, pelo que a comparação incide sobre o modelo de dados e não sobre o texto. A RFC 8259 define um objeto como uma coleção sem ordem, e é por isso que aqui uma mudança de ordem das chaves ou de indentação é reportada como idêntica, ao passo que um diff por linhas a marcaria como alteração. As chaves presentes num só lado tornam-se ADICIONADO ou REMOVIDO; os arrays são emparelhados por índice, por isso uma inserção perto do início desloca tudo o que vem a seguir e surge como uma série de alterações em vez de um movimento. As folhas são comparadas por tipo e valor, o que faz de 30 contra "30" uma diferença real. Os caminhos são escritos com pontos e parênteses retos (user.tags[1]), espelhando a ideia do JSON Pointer de endereçar um nó dentro do documento.
Recursos do comparador
Como comparar dois JSON
Cole o primeiro documento no campo JSON à esquerda — pode ser a versão original, anterior ou de referência.
Cole o segundo documento no campo JSON à direita — a versão nova, gerada ou recebida da API.
Leia o status: ele informa se os dois documentos são estruturalmente idênticos ou se há divergências.
Percorra a lista de diferenças e use o caminho (por exemplo, usuario.enderecos[1].cep) para localizar cada ponto no arquivo original.
Erros comuns ao comparar JSON
Exemplos de comparação
Veja também
- Formatador JSON — Um dos lados não faz parse? Formate-o primeiro — o formatador aponta o carácter culpado.
- CSV para JSON — A comparar duas exportações de folha de cálculo? Passe ambas a JSON e compare a estrutura.
Perguntas frequentes
A ordem das chaves de um objeto influencia o resultado?
Não. A comparação é estrutural, então {"a":1,"b":2} e {"b":2,"a":1} são reportados como estruturalmente idênticos. O mesmo vale para indentação e espaçamento diferentes, que não geram nenhuma diferença.
Como os arrays são comparados?
Arrays são comparados por índice: a posição 0 do primeiro documento é confrontada com a posição 0 do segundo, e assim por diante. Por isso, reordenar itens de uma lista aparece como um conjunto de diferenças ALTERADO nas posições afetadas, e não como uma simples troca de ordem.
O que acontece quando o tipo do valor muda?
Uma mudança de tipo no mesmo caminho é reportada como ALTERADO. Se o valor era o número 42 e passou a ser a string "42", a diferença aparece com o caminho correspondente, mesmo que os dois pareçam iguais na leitura.
Por que alguns valores aparecem cortados no relatório?
Os valores exibidos na lista de diferenças são truncados em 60 caracteres para manter o relatório legível quando há textos longos, base64 ou blocos extensos. O truncamento afeta apenas a exibição: a comparação em si considera o valor inteiro.