Pular para o conteúdo principal

Como comparar dois arquivos JSON

Cole os dois documentos JSON nos dois painéis da ferramenta Comparar JSON, compare-os e leia a lista de mudanças que ela produz — adições, remoções e mudanças de valor, com a ordem das chaves e os espaços em branco ignorados. Tudo roda no seu navegador; exporte o resultado como um patch RFC 6902 quando precisar de um registro legível por máquina das diferenças.

Só local
Só quer a ferramenta? Abra Comparar JSONIgnora a ordem das chaves e exporta patch RFC 6902Abrir ferramenta

Como comparar dois arquivos JSON: explicação

Dois documentos JSON raramente discordam em voz alta. Um tem uma chave que o outro não tem, um aninha a config um nível mais fundo, um escreve um número entre aspas e o outro deixa sem aspas — e um diff linha a linha responde a cada uma dessas diferenças cosméticas com um muro de vermelho. O que você realmente quer saber é menor e mais útil: quais valores mudaram, quais chaves apareceram ou desapareceram, e se a estrutura de que você depende ainda tem a forma que você espera.

Esta página conduz o trabalho de ponta a ponta com a ferramenta Comparar JSON do site — quatro etapas, cada uma com uma verificação que você pode fazer antes de seguir para a próxima. A comparação inteira roda no seu navegador: os documentos são analisados em árvores de sintaxe localmente e nunca saem da aba, e é por isso que o mesmo procedimento é seguro para configs com hostnames, credenciais que você já rotacionou ou dados de clientes que você preferiria não colar no campo de formulário de um desconhecido.

Antes de começar, saiba o que a ferramenta vai e não vai te dizer. Ela compara os dois documentos que você dá a ela — não conhece o histórico do git, nem deploys, nem intenção. A lista de mudanças é um fato sobre dois documentos, não uma explicação de quem mudou o quê e por quê; as etapas abaixo incluem onde olhar quando você precisar da segunda metade dessa história.

Cada etapa abaixo acontece na ferramenta Comparar JSON — dois painéis, uma ação de comparar e uma lista de mudanças que ignora tudo que é cosmético.

Se o vocabulário de objetos, arrays e chaves é novidade, o guia sobre o que é JSON cobre isso em linguagem simples antes de você comparar qualquer coisa.

Os passos

  1. Abra a ferramenta e carregue o primeiro documento

    Abra a ferramenta Comparar JSON e coloque o primeiro documento no painel esquerdo. Você pode colá-lo, arrastar o arquivo para o painel ou carregar o exemplo embutido, se preferir ensaiar primeiro com dados de amostra. Os arquivos são lidos pelo próprio navegador — não existe etapa de envio neste procedimento em momento nenhum.

    Verifique: O painel esquerdo aceita o documento sem erro de análise, o que significa que o JSON era válido o suficiente para comparar. Um erro de análise ali é a ferramenta dizendo qual linha corrigir antes que qualquer outra coisa funcione.

  2. Carregue o segundo documento à direita

    Coloque o segundo documento no painel direito do mesmo jeito. A ordem importa para a nomenclatura, não para a correção: a esquerda é a referência e a direita é a versão comparada contra ela, e o botão “Trocar” troca os lugares se você escolheu a direção errada. Com os dois lados carregados, a comparação pode rodar.

    Verifique: Os dois painéis contêm um documento, e não um erro. Se só um lado é analisado, a comparação não pode começar — corrija primeiro o lado com problema, em vez de comparar um documento contra nada.

  3. Compare e leia a lista de mudanças

    Rode a comparação. O resultado é uma lista de diferenças reais: chaves adicionadas de um lado, chaves removidas do outro e valores que mudaram por baixo de um caminho de chaves inalterado. A ordem das chaves e os espaços em branco são ignorados de propósito — {"a":1,"b":2} e {"b":2,"a":1} são o mesmo documento aqui, e dizer isso é o sentido de um diff semântico. Use Alt+↑ e Alt+↓ para percorrer a lista sem recorrer ao mouse.

    Verifique: Uma mudança que você sabe que existe (renomeie um valor de propósito antes de comparar, se quiser um ensaio) aparece como exatamente uma linha, e não como uma reescrita de todas as linhas em volta. Esse é o sinal de que você está lendo semântica, não texto.

  4. Exporte as diferenças como um patch

    Quando a lista estiver certa, exporte-a como um JSON Patch RFC 6902 — um documento pequeno e ordenado que diz add, remove e replace para cada mudança. O patch é o que transforma uma sessão de leitura num registro: entregue-o a um colega, anexe-o a um ticket ou aplique-o no documento da esquerda em outro lugar e reproduza o lado direito exatamente.

    Verifique: O patch exportado é ele próprio um JSON válido e visivelmente menor do que qualquer um dos documentos. Aplicá-lo a uma cópia do documento da esquerda deve produzir o da direita.

O que um diff semântico ignora de propósito

A ferramenta analisa os dois documentos em árvores e compara as árvores, então três tipos de diferença jamais chegam à lista de mudanças. Ordem das chaves: um objeto é um mapeamento, não uma sequência, e nenhum consumidor atribui significado à ordem em que suas chaves foram escritas. Espaços em branco insignificantes: indentação e espaçamento são apresentação, e reformatar um lado não deveria produzir uma única mudança. Grafia de números quando o valor é igual: 1 e 1.0 nomeiam o mesmo número nas comparações que importam.

O que chega à lista é tudo que muda o significado do documento: um valor alterado, uma chave que apareceu ou sumiu, uma troca de tipo — a string "42" virar o número 42 é uma mudança real, e a ferramenta a classifica como tal em vez de aceitá-la silenciosamente. Se uma mudança que você esperava não está lá, a primeira pergunta honesta é se ela era uma das três cosméticas.

Arrays: correspondência por posição ou por chave

Arrays são o único lugar em que um diff semântico precisa escolher, porque ["a","b"] contra ["b","a"] pode ser lido de duas maneiras: tudo se moveu, ou nada mudou e a ordem é significativa. A ferramenta deixa você decidir — a correspondência por índice trata o array como uma sequência, enquanto a correspondência por um campo de chave primária alinha os elementos por identidade, como faria um banco de dados.

Para listas de registros (usuários, hosts, eventos), a correspondência por chave é quase sempre o que você quer: inserir um novo registro no topo produz então uma única adição, em vez de remexer todas as linhas. Para listas em que a ordem é o significado — etapas de um procedimento, resultados ranqueados — a correspondência por índice é a escolha honesta. Escolha de propósito, em vez de deixar o padrão decidir por você.

Arquivos grandes e onde o trabalho realmente roda

A comparação roda em um Web Worker, fora da thread principal da página, com um teto de 100 MB por documento. A consequência prática é que um par grande ainda leva segundos reais para comparar — mas a aba continua viva enquanto ele trabalha, e você pode continuar rolando a lista de mudanças já na tela em vez de ficar olhando para uma página congelada.

O modo de mesclagem de três vias — em que um documento base encontra dois ramos editados — calcula na própria página e, por isso, para em 8 MB. Se as entradas da sua mesclagem forem maiores que isso, a comparação de dois documentos descrita acima continua disponível em tamanho completo.

Quando um diff de JSON é o instrumento errado

Dois documentos em formatos diferentes — uma config em JSON e uma tradução dela em YAML — precisam de um convertido primeiro, senão o diff vai gastar todas as linhas dizendo que os contêineres diferem. Converta um lado para o formato do outro e depois compare. E quando a pergunta não é estruturada de modo nenhum — dois arquivos de log, dois parágrafos de prosa — uma comparação de texto puro é a ferramenta certa, e a maquinaria de JSON não adiciona nada além de ruído.

O inverso também vale: se você se pega lendo uma lista de mudanças e narrando a intenção em voz alta — "foi aqui que eles moveram o timeout" — o diff fez seu trabalho, e um registro da mudança pertence a algum lugar estruturado. A exportação RFC 6902 existe precisamente para que a sessão de leitura termine com um artefato em vez de uma lembrança.

Perguntas frequentes

Meus arquivos JSON são enviados quando eu comparo aqui?

Não. Os dois documentos são analisados e comparados dentro da aba do seu navegador — o motor de comparação roda em um Web Worker na sua máquina, e não existe endpoint de envio para onde mandá-los. Você pode confirmar no DevTools: abra o painel Network, rode uma comparação e nenhuma requisição carrega seus dados. A Content-Security-Policy da página também recusa conexões de saída por construção.

Por que reordenar chaves não aparece como diferença?

Porque um objeto é um mapeamento, não uma lista ordenada — {"a":1,"b":2} e {"b":2,"a":1} carregam exatamente a mesma informação, e todo parser de JSON constrói a mesma árvore a partir de ambos. Um diff que reporta reordenação de chaves na verdade está reportando formatação, o que é ruído para o leitor que quer saber o que mudou semanticamente. Espaços em branco são ignorados pelo mesmo motivo.

O que é um patch RFC 6902 e por que exportar um?

A RFC 6902 define o JSON Patch: um documento JSON que lista operações — add, remove, replace, move, copy, test — cada uma apontando para um caminho específico. Exportar sua comparação como um transforma a lista de mudanças num registro aplicável por máquina: o mesmo patch aplicado ao documento da esquerda reproduz o lado direito, o que o torna uma entrega precisa para um colega, um fixture de teste ou um script de migração.

Qual é o tamanho máximo dos dois arquivos JSON?

Até 100 MB por documento. A análise e a comparação rodam em um Web Worker, então um par grande leva tempo real, mas não congela a aba — a interface continua responsiva e as linhas já renderizadas continuam roláveis enquanto o worker trabalha. O modo separado de mesclagem de três vias tem seu próprio teto, menor, de 8 MB, porque esse cálculo roda na thread principal da página.

Dá para comparar arrays sem tratar toda linha como alterada?

Sim — essa é a configuração de correspondência de arrays. A correspondência por índice compara o elemento 0 com o elemento 0 e é a certa quando a ordem carrega significado. A correspondência por chave alinha os elementos por um campo que você escolhe (um id, um slug, um hostname) e é a certa para listas de registros, em que inserir uma linha nova deve produzir uma mudança, e não uma reescrita da lista. A configuração existe porque nenhuma das respostas é correta para todo array.

O diff me diz qual mudança aconteceu primeiro, ou quem a fez?

Não — e nenhum diff consegue. Uma comparação vê dois documentos, não uma linha do tempo: ela sabe que um valor mudou, e não pode saber quando, por quem nem por quê. Essa história vive no controle de versão, nos logs de deploy ou em qualquer processo que editou o arquivo. A exportação do patch é a ponte: anexe-a ao ticket ou commit onde a história está sendo contada.