Comparador de JSON Online (JSON Diff)

Compare dois JSON online e veja, por caminho, o que foi adicionado, removido ou alterado. Ignora a ordem das chaves, compara arrays sem ordem e gera JSON Patch.

Comparar dois JSON online

Cole o JSON original no campo A e o novo no campo B e clique em Comparar. A comparação é semântica: espaços, quebras de linha e a ordem das chaves não contam — só o conteúdo. Tudo roda no seu navegador; nenhum dos dois textos é enviado a servidor, então dá para comparar respostas de API com dados reais.

Opções de comparação

Com uma chave (como id), os objetos de um array são pareados pelo valor dela, em qualquer ordem, e comparados campo a campo.

Como ler o resultado

Cada diferença aparece com o caminho até o valor, no estilo JSONPath: $ é a raiz, .chave entra em um objeto e [1] é o segundo item de um array (a contagem começa em 0). Assim, $.usuario.enderecos[1].cep é o CEP do segundo endereço do usuário.

SímboloSignificadoExemplo
+Adicionado: só existe em B+ $.usuario.telefone: "+55 41 99999-0000"
−Removido: só existe em A− $.cupom: null
~Alterado: mesmo tipo, valor diferente~ $.total: 150 → 175.5
!Tipo diferente! $.itens: número 3 → string "3"

Os símbolos e os rótulos por extenso acompanham as cores, então o resultado continua legível em preto e branco ou para quem não distingue verde de vermelho. A árvore mostra as diferenças dentro da estrutura do documento; a lista por caminho traz uma linha por diferença e pode ser filtrada (digite enderecos para ver só o que mudou ali). “Tudo” inclui também os valores iguais. Quando não há nenhuma diferença, a ferramenta avisa que os dois JSON são equivalentes.

Por que comparar JSON como texto não funciona

Um diff de texto comum compara linha por linha. Só que dois documentos JSON podem ter o mesmo conteúdo e textos bem diferentes:

{"nome": "Ana", "idade": 30}
{
  "idade": 30,
  "nome": "Ana"
}

A especificação do JSON (RFC 8259) define o objeto como uma coleção não ordenada de pares nome/valor, e muitas bibliotecas não preservam a ordem ao serializar. Um diff de texto acusaria todas as linhas; o comparador semântico diz que os dois são equivalentes. Já os arrays são sequências ordenadas: [1, 2] e [2, 1] são diferentes pela especificação — por isso a ordem dos itens importa no modo padrão.

Arrays: por posição, sem ordem ou por chave

  • Por posição (padrão): o item 0 de A é comparado com o item 0 de B, e assim por diante. É o comportamento fiel à especificação, mas um item inserido no começo “desloca” todos os seguintes, que passam a aparecer como alterados.
  • Ignorar a ordem: o array é tratado como um multiconjunto. Cada item de A procura um item de B com conteúdo idêntico (igualdade profunda); o que sobrar aparece como removido ou adicionado. Repetições contam: [1, 1, 2] e [1, 2, 2] continuam diferentes. Útil para listas de tags, permissões e resultados que a API devolve sem ordem garantida.
  • Chave identificadora: informe o nome de um campo único, como id. Em todo array cujos itens sejam objetos com essa chave (sem valores repetidos), os itens são pareados pelo valor dela, em qualquer ordem, e comparados campo a campo. O caminho passa a mostrar a chave, como em $.usuario.enderecos[id=2].cep — essa parte é uma notação desta ferramenta, não JSONPath. Arrays que não se encaixam (itens sem a chave ou com valor repetido) seguem o modo escolhido acima, e a ferramenta avisa quais foram.

As outras opções

Tratar 1 e 1.0 como iguais (ligada por padrão). O JSON tem um único tipo numérico: não existe “inteiro” e “decimal” na especificação. Em JavaScript, 1 e 1.0 viram exatamente o mesmo valor; outras linguagens, como Python, leem um como int e o outro como float. Como na maioria dos casos a diferença é só de escrita, o padrão é considerar iguais também 100 e 1e2. A comparação é exata, feita sobre os dígitos — 12345678901234567890 e 12345678901234567891 são reconhecidos como diferentes, mesmo estando além da precisão do JSON.parse. Desligue a opção se a escrita importar para o seu sistema.

Ignorar diferença entre null e chave ausente. Com ela, {"nome": "Ana", "apelido": null} equivale a {"nome": "Ana"}. Vale só para chaves de objetos: dentro de arrays, null continua ocupando uma posição.

Ignorar maiúsculas/minúsculas. Vale para os valores de texto ("Ativo" = "ATIVO"), não para os nomes das chaves.

Exportar como JSON Patch (RFC 6902)

O JSON Patch é um formato padronizado (RFC 6902) para descrever alterações em um documento JSON: uma lista de operações com op, path e, quando necessário, value. A ferramenta gera um patch com as operações add, remove e replace que, aplicado a A, resulta exatamente em B. Um trecho do patch do exemplo pronto:

[
  { "op": "replace", "path": "/usuario/email", "value": "[email protected]" },
  { "op": "add", "path": "/usuario/telefone", "value": "+55 41 99999-0000" },
  { "op": "remove", "path": "/cupom" }
]

O path usa JSON Pointer (RFC 6901): segmentos separados por /, com ~ escrito como ~0 e / como ~1 dentro dos nomes. O patch é sempre estrito — arrays por posição, null diferente de ausente, maiúsculas contam —, porque precisa reproduzir B fielmente; as opções de “ignorar” valem só para o relatório. A única tolerância é a da própria RFC: números são iguais quando têm o mesmo valor numérico. O patch gerado é correto, mas não necessariamente o menor possível: a operação move, por exemplo, não é usada.

Casos de uso

  • Comparar respostas de API entre ambientes (homologação e produção) ou antes e depois de um deploy.
  • Revisar arquivos de configuração, como package.json, tsconfig.json ou traduções em JSON, sem se distrair com reordenação de chaves.
  • Depurar testes em que o JSON esperado e o recebido “parecem iguais”.
  • Conferir migrações de dados e exportações de banco, pareando registros pelo id.

Se algum dos lados estiver com erro de sintaxe, a ferramenta indica linha e coluna. Para investigar melhor, use o validador de JSON; para apenas indentar ou minificar, o formatador de JSON. Se os dados vierem de planilha, o conversor CSV ↔ JSON ajuda, e o conteúdo de um token pode ser extraído com o decodificador de JWT ou com o Base64 encode/decode.

Limitações

  • Cada campo aceita até 3 milhões de caracteres e 200 níveis de aninhamento. A tela mostra no máximo 1.500 linhas na árvore e 500 itens na lista; o relatório copiado traz todas as diferenças.
  • No modo “ignorar a ordem”, itens sem par idêntico aparecem como um removido e um adicionado, sem detalhar o que mudou dentro deles. Para ver campo a campo, use a chave identificadora.
  • Se uma chave aparece duas vezes no mesmo objeto, vale o último valor (como no JSON.parse), e a ferramenta avisa.
  • Só JSON puro: comentários, vírgula sobrando e aspas simples (JSON5/JSONC) são apontados como erro.

Perguntas frequentes

A ordem das chaves faz diferença na comparação?

Não. {"a": 1, "b": 2} e {"b": 2, "a": 1} são equivalentes, porque objetos JSON não têm ordem definida. Só a ordem dos itens de arrays conta — e mesmo essa pode ser ignorada nas opções.

Meus dados são enviados para algum servidor?

Não. A leitura e a comparação são feitas por JavaScript no seu navegador. Nada é transmitido nem armazenado.

Qual a diferença entre “alterado” e “tipo diferente”?

“Alterado” (~) é quando o valor mudou mas continua do mesmo tipo, como 30 → 31. “Tipo diferente” (!) é quando o tipo mudou — por exemplo, o número 3 virou a string "3", ou um objeto virou array. Costuma ser o tipo de diferença que mais quebra integrações, por isso é contado à parte.

Como comparar duas listas de objetos que vêm em ordens diferentes?

Preencha a chave identificadora com o campo único dos itens (id, codigo, sku…). Cada objeto de A é comparado com o objeto de B que tem o mesmo valor nessa chave, e você vê exatamente quais campos mudaram, quais itens sumiram e quais são novos.

Por que 1 e 1.0 aparecem como iguais?

Porque representam o mesmo número, e o JSON não diferencia inteiros de decimais. Se o seu sistema trata os dois de forma diferente, desmarque a opção “Tratar 1 e 1.0 como iguais”: a diferença passa a aparecer como alterada, com a nota de que só a escrita mudou.

Posso aplicar o JSON Patch gerado em qualquer biblioteca?

Sim, em qualquer biblioteca que siga a RFC 6902, desde que o documento de partida seja exatamente o JSON A. As operações são aplicadas em sequência, na ordem em que aparecem.