Pular para o conteúdo

Ferramenta de Comparação JSON - Compare JSON Online Grátis | Diferenças JSON

Compare JSON online gratuitamente com nossa ferramenta rápida de comparação JSON. Encontre diferenças instantaneamente com resultados coloridos. Diff JSON 100% seguro, baseado no navegador. Sem necessidade de cadastro.

Ferramenta de Comparação JSON

Calculadora de carregamento...
📚

Documentação

Uma ferramenta de comparação de JSON, geralmente chamada de ferramenta de diff de JSON, compara dois valores JSON (JavaScript Object Notation) e informa o que mudou entre eles. Ela lista cada propriedade ou item de array que foi adicionado, removido ou modificado, junto com sua localização exata nos dados. Esta página explica como funciona a ferramenta de comparação de JSON do whiz.tools, com exemplos práticos baseados em sua lógica de comparação real.

O que é comparação de JSON?

Comparação de JSON é o processo de verificar dois documentos JSON entre si para encontrar diferenças. Um documento JSON é um trecho de texto formado por objetos (pares chave-valor entre chaves), arrays (listas ordenadas entre colchetes) e valores primitivos, como strings, números, booleanos e nulos. Comparar dois desses documentos visualmente é lento e sujeito a erros quando eles passam de algumas linhas, por isso uma ferramenta de comparação faz a correspondência automaticamente e destaca cada alteração.

Desenvolvedores usam esse tipo de comparação para verificar respostas de APIs, acompanhar alterações em arquivos de configuração, confirmar que uma migração de dados não perdeu informações e revisar alterações em arquivos JSON no controle de versão.

Como a ferramenta compara dois valores JSON

A ferramenta analisa as duas entradas com um analisador JSON padrão e percorre os dois valores resultantes em conjunto, um nível por vez. A cada etapa, ela faz três perguntas, nesta ordem:

  1. Os dois valores têm tipos diferentes (por exemplo, um é um objeto e o outro é um número), ou um é null enquanto o outro não é? Nesse caso, ela registra uma modificação nesse ponto e interrompe a comparação em níveis mais profundos.
  2. Os dois valores são primitivos (uma string, um número, um booleano ou null)? Nesse caso, ela os compara diretamente. Qualquer diferença, inclusive uma alteração do número 123 para a string "123", conta como modificação.
  3. Os dois valores são objetos ou os dois são arrays? Nesse caso, ela compara o conteúdo usando as regras abaixo e repete o processo em quaisquer objetos ou arrays aninhados.

Cada diferença é registrada com um caminho, como user.address.city ou tags[1], facilitando sua localização no documento original. Os membros de objetos são separados por ponto, e os itens de arrays são mostrados com seu índice entre colchetes. Uma diferença no nível mais alto do documento, como um array substituído por um objeto, não tem um caminho dentro dos dados; por isso, é identificada como $. Esse é o identificador da raiz definido pela RFC 9535, o padrão JSONPath, e representa o documento inteiro.

Comparação de objetos

Para comparar dois objetos JSON, a ferramenta reúne todas as chaves que aparecem em qualquer um dos objetos. Para cada chave:

  • Se a chave existir apenas no segundo objeto, ela será uma propriedade adicionada.
  • Se a chave existir apenas no primeiro objeto, ela será uma propriedade removida.
  • Se a chave existir nos dois objetos, a ferramenta comparará os dois valores recursivamente.

A ordem das chaves não importa. O padrão JSON não define uma ordem para os membros de objetos, portanto {"a":1,"b":2} e {"b":2,"a":1} são tratados como idênticos.

Comparação de arrays

Os arrays são comparados por posição, não por conteúdo. A ferramenta percorre os dois arrays índice por índice e compara o que estiver em cada índice, até o tamanho do array mais longo. Se um array for menor, os itens adicionais no final do array mais longo serão informados como adicionados ou removidos.

Isso significa que a ferramenta nunca tenta fazer a correspondência entre itens de arrays pelo conteúdo. Ela não percebe que um objeto foi “movido” do índice 1 para o índice 2; apenas identifica que o valor em cada índice mudou. A exclusão ou inserção de um item no meio de um array desloca todos os itens seguintes uma posição, por isso normalmente aparece como várias modificações separadas, e não como uma única adição ou remoção bem definida.

Exemplos práticos

Exemplo 1: comparação de dois objetos

Primeiro JSON:

1{ "user": { "address": { "city": "New York", "zip": "10001" } } }
2

Segundo JSON:

1{ "user": { "address": { "city": "Boston", "zip": "02108" } } }
2

Resultado:

  • Modificado user.address.city: "New York" → "Boston"
  • Modificado user.address.zip: "10001" → "02108"

Exemplo 2: alteração no final de um array

Primeiro JSON:

1{ "tags": ["important", "urgent", "review"] }
2

Segundo JSON:

1{ "tags": ["important", "critical", "review", "documentation"] }
2

O índice 0 não foi alterado, o índice 1 mudou, o índice 2 não foi alterado e o índice 3 existe apenas no segundo array. Resultado:

  • Modificado tags[1]: "urgent" → "critical"
  • Adicionado tags[3]: "documentation"

Exemplo 3: remoção de um item no meio de um array

Este exemplo mostra o que acontece quando um item é removido do meio de um array, uma situação que costuma causar confusão.

Primeiro JSON:

1{
2  "products": [
3    { "id": 1, "name": "Laptop", "price": 999.99 },
4    { "id": 2, "name": "Mouse", "price": 24.99 },
5    { "id": 3, "name": "Keyboard", "price": 59.99 }
6  ]
7}
8

Segundo JSON, com a entrada "Mouse" excluída e uma entrada "Monitor" adicionada ao final:

1{
2  "products": [
3    { "id": 1, "name": "Laptop", "price": 899.99 },
4    { "id": 3, "name": "Keyboard", "price": 59.99 },
5    { "id": 4, "name": "Monitor", "price": 349.99 }
6  ]
7}
8

Uma pessoa que observasse isso diria: “Mouse foi removido e Monitor foi adicionado.” Como a ferramenta compara estritamente por índice, ela não interpreta os dados dessa forma. Ela compara o índice 0 com o índice 0, o índice 1 com o índice 1 e o índice 2 com o índice 2. Assim, cada campo depois do item excluído é comparado com o objeto errado. O resultado real são sete modificações:

  • Modificado products[0].price: 999.99 → 899.99
  • Modificado products[1].id: 2 → 3
  • Modificado products[1].name: "Mouse" → "Keyboard"
  • Modificado products[1].price: 24.99 → 59.99
  • Modificado products[2].id: 3 → 4
  • Modificado products[2].name: "Keyboard" → "Monitor"
  • Modificado products[2].price: 59.99 → 349.99

Para obter um resultado mais claro ao comparar listas como essa, ordene ou estruture os dois arrays da mesma maneira antes de colá-los na ferramenta. Por exemplo, escreva cada lista na mesma ordem ou faça a correspondência dos objetos por um campo de ID antes da comparação.

O que a ferramenta não faz

  • Ela não faz a correspondência entre itens de arrays pelo conteúdo. Como mostrado acima, a comparação é feita exclusivamente pela posição do índice, portanto a ferramenta não consegue reconhecer que um item foi movido em vez de alterado.
  • Ela não detecta referências circulares. Na prática, isso não é uma limitação: as duas entradas vêm de JSON.parse, que sempre cria uma árvore simples e nunca pode produzir um valor que faça referência a si mesmo. Referências circulares não podem existir em texto JSON válido.
  • Ela não oferece uma configuração para ordenar arrays antes da comparação. Reordenar os itens da entrada antes de colá-los é a única maneira de evitar o efeito de deslocamento de índices descrito acima.

Como usar a ferramenta

  1. Cole o primeiro documento JSON na caixa à esquerda e o segundo na caixa à direita.
  2. A ferramenta os compara automaticamente assim que as duas caixas contêm texto. Como alternativa, clique em Comparar para executar a comparação manualmente.
  3. Leia a lista de resultados. Cada linha mostra um caminho, como user.age, e indica se o item foi adicionado, removido ou modificado, com os valores antigo e novo exibidos lado a lado.
  4. Clique em Copiar para copiar os resultados como texto simples.

Se uma caixa contiver texto que não seja um JSON válido, a ferramenta exibirá um erro abaixo dela em vez de fazer uma comparação. Quando as duas caixas contêm JSON inválido, os dois erros aparecem ao mesmo tempo.

Perguntas frequentes

O que conta como uma diferença entre dois valores JSON?
Uma propriedade ou um item de array é diferente se existir em apenas um dos dois documentos ou se existir nos dois, mas contiver um valor ou tipo diferente. Alterar o valor do número 5 para a string "5" conta como uma modificação, mesmo que eles possam parecer semelhantes.

A ordem dos itens importa?
Depende do contêiner. Os objetos JSON não têm uma ordem de membros definida, portanto dois objetos com as mesmas chaves e valores em uma ordem diferente são tratados como idênticos. Arrays são ordenados, e a ferramenta os compara pela posição do índice. Por isso, mover um item para outra posição é informado como uma série de modificações, e não como uma movimentação.

O que significa um caminho de resultado $?
Isso significa que o documento inteiro foi alterado, e não apenas uma parte dele. Isso acontece quando as duas entradas têm tipos de valor diferentes no nível mais alto, por exemplo, um array de um lado e um objeto do outro, ou os números simples 1 e 2. $ é o identificador da raiz definido pela RFC 9535, o padrão JSONPath.

Meus dados JSON são enviados para um servidor?
Não. A comparação é executada no navegador usando JavaScript. Nada é enviado.

A formatação, como indentação ou minificação, afeta o resultado?
Não. As duas entradas são analisadas como valores JSON antes da comparação, portanto espaços em branco, indentação e quebras de linha não fazem diferença. Apenas os dados reais são comparados.

A ferramenta pode comparar JSON com comentários ou vírgulas finais?
Não. O JSON padrão, conforme definido na RFC 8259, não permite comentários nem vírgulas finais. Entradas que contenham esses elementos são rejeitadas como inválidas.

Referências

  1. IETF. “The JavaScript Object Notation (JSON) Data Interchange Format.” RFC 8259, dezembro de 2017.
  2. IETF. “JavaScript Object Notation (JSON) Patch.” RFC 6902, abril de 2013.
  3. IETF. “JSONPath: Query Expressions for JSON.” RFC 9535, fevereiro de 2024. (A seção 2.2 define o identificador da raiz $.)
  4. Mozilla Developer Network. “JSON.parse().”