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.

Entrada

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

Comparação por forma e valor: ordem das chaves e indentação diferentes ainda resultam em "estruturalmente idêntico".
Percurso em profundidade que reporta todas as diferenças de folha, e não apenas a primeira encontrada.
Classificação explícita de cada divergência como ADICIONADO, REMOVIDO ou ALTERADO.
Caminho completo até cada folha, no formato x.y[1], com arrays comparados por índice.

Como comparar dois JSON

1

Cole o primeiro documento no campo JSON à esquerda — pode ser a versão original, anterior ou de referência.

2

Cole o segundo documento no campo JSON à direita — a versão nova, gerada ou recebida da API.

3

Leia o status: ele informa se os dois documentos são estruturalmente idênticos ou se há divergências.

4

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

Esperar que arrays sejam comparados por conteúdo: a comparação é por índice, então reordenar itens de uma lista gera diferenças em todas as posições deslocadas.
Ignorar mudanças de tipo: quando o mesmo caminho passa de número para string (5 para "5"), a diferença é reportada como ALTERADO, não como igualdade.
Estranhar valores cortados no relatório: os valores exibidos são truncados em 60 caracteres para manter a leitura fluida — o corte é apenas visual.

Exemplos de comparação

{"a":1,"b":2} vs {"b":2,"a":1} -> estruturalmente idênticos (a ordem das chaves não importa)
{"user":{"age":30}} vs {"user":{"age":"30"}} -> ALTERADO em user.age: 30 -> "30"
{"tags":["a","b"]} vs {"tags":["a"],"ok":true} -> REMOVIDO em tags[1]: "b"; ADICIONADO em ok: true

Veja também

  • Formatador JSONUm dos lados não faz parse? Formate-o primeiro — o formatador aponta o carácter culpado.
  • CSV para JSONA 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.