JSON Diff: Compare Dois Arquivos JSON Online
Cole, formate e compare dois trechos de JSON lado a lado. Validação, formatação e minificação embutidas.
O que é a ferramenta de comparação de JSON?
Uma ferramenta grátis, no navegador, para comparar dois documentos JSON. Cole a versão antiga à esquerda, a nova à direita, e as diferenças se acendem caractere por caractere. Nada sai da sua máquina.
Ela usa o JSON.parse nativo do seu navegador para validação. Tem um botão Format para quando seu JSON vem numa única linha minificada gigante, um botão Minify para o caso oposto, e validação ao vivo que sinaliza erros de sintaxe enquanto você digita.
Se você já encarou um diff de openapi.json de 6.000 linhas num PR do GitHub tentando achar o único campo que quebrou um cliente downstream, essa é a ferramenta que te leva até lá em segundos.
Como o diff funciona de verdade
O diff é em nível de caractere, depois limpo com pós-processamento semântico para que os destaques caiam em pedaços com significado em vez de caracteres aleatórios. Inserções aparecem em verde no painel direito, remoções em vermelho no painel esquerdo.
JSON tem suas próprias peculiaridades que a especificação destaca. A especificação JSON na RFC 8259 define objetos como não ordenados, então reordenar chaves tecnicamente não muda nada apesar de um diff de texto sinalizar isso. Lidamos com isso oferecendo um botão Format de cada lado: formate os dois, depois compare, e a ordem fica consistente. Para trabalho estrutural mais fundo, dê uma olhada em JSON Patch (RFC 6902) ou no mais simples formato JSON Merge Patch (RFC 7396), que são as duas maneiras padrão de descrever uma mudança de JSON como dado.
Quando a ordem importa para hashing ou assinatura, a especificação relevante é RFC 8785 (JSON Canonicalization Scheme). Ordene as chaves, normalize a formatação dos números, depois faça o diff.
Como comparar JSON em três passos
Dois painéis de texto, um diff. Sem cadastro, sem upload, sem ida e volta ao servidor.
- 1
Cole ou faça upload do seu JSON
Cole o JSON antigo à esquerda, o novo à direita. Ou clique em Upload em qualquer lado para carregar um arquivo .json direto. O botão Sample preenche os dois painéis com um exemplo pequeno se você quiser ver a ferramenta em ação primeiro.
- 2
Formate os dois lados para uma comparação justa
Clique em Format em cada painel para imprimir com indentação de dois espaços. Isso normaliza espaços em branco e quebras de linha para que o diff destaque mudanças reais nos dados, e não diferenças de formatação. O selo de validação fica verde quando seu JSON faz parse sem erros.
- 3
Leia o diff
Remoções aparecem com destaque vermelho à esquerda, inserções com destaque verde à direita. Role um lado e o outro acompanha. Os contadores de mudança em cada cabeçalho dizem quantas edições distintas o diff encontrou.
Quando o diff de JSON é a ferramenta certa
Auditar mudanças de política IAM antes do apply
Cole a saída atual de aws iam get-policy-version contra o JSON proposto para ver exatamente quais entradas Action foram adicionadas, ou se alguém colocou "Resource": "*" dentro de uma statement antes específica. O console da AWS reordena statements ao salvar, o que torna um diff do GitHub enganoso; formate os dois lados aqui e a mudança real fica óbvia.
Detectar drift silencioso em planos do Terraform
Quando terraform show -json tfplan retorna um blob de 4 MB, olhar a olho nu é caso perdido. Compare o plano de hoje com o de ontem para fazer aparecer o aws_security_group_rule que alguém adicionou debaixo de uma PR de refactor, ou o bloco lifecycle.ignore_changes que sumiu sem barulho.
Revisar mudanças de schema OpenAPI antes do merge
Um diff de openapi.json de 6.000 linhas é ilegível quando um gerador de código reordena paths em ordem alfabética. Formate os dois lados, compare, e a mudança real aparece: um campo required adicionado a CreateOrderRequest, ou uma resposta 200 cujo schema mudou silenciosamente de string para string | null.
Depurar package-lock.json depois de um merge
Depois de resolver um conflito em package-lock.json, compare seu arquivo resolvido com o lockfile da main para pegar um downgrade transitivo. O npm às vezes resolve a mesma faixa de semver para versões exatas diferentes em máquinas diferentes, que é a real causa do "funciona na minha máquina, falha na CI". Leia a documentação do package-lock.json para o que cada campo significa.
Comparar mappings do Elasticsearch entre ambientes
Puxe GET /my-index/_mapping de staging e de produção e jogue os dois no diff. Produção pode ainda ter "type": "text" num campo que staging migrou para "keyword" na sprint passada, que é exatamente o motivo de a query de agregação não retornar nada em produção e funcionar localmente. Mappings aninham em cinco ou seis níveis e um diff de texto enterra isso no ruído.
Reproduzir mocks de API instáveis
Quando um teste de Playwright passa local e falha na CI, capture o corpo JSON da resposta que o teste viu de fato e compare com a fixture do seu repo. Geralmente é um timestamp createdAt ou um campo traceId que ninguém fixou, e o diff estrutural deixa a chave culpada óbvia em vez de te jogar num paredão de texto formatado.
Referência rápida de JSON
Um resumo curto dos casos de borda do parsing que essa ferramenta tira mais frequentemente da sombra. Tudo embasado na especificação JSON.
| Topic | What this tool does |
|---|
| Ordem de chaves do objeto | Não ordenado pela spec. {"a":1,"b":2} é igual a {"b":2,"a":1}. Use Sort keys para normalizar antes de comparar. |
|---|
| Ordem do array | Ordenado. [1,2,3] não é igual a [3,2,1]. Ordene manualmente se a ordem não importar para o seu caso. |
|---|
| Vírgulas finais | Não permitidas. { "a": 1, } dá erro de parse no JSON padrão. Permitidas em JSON5/JSONC, que são supersets: tire antes. |
|---|
| Comentários | Não permitidos. // assim dá erro de parse. JSON5 e JSONC aceitam; esta ferramenta segue a gramática estrita da RFC 8259. |
|---|
| Números | Parseados como floats IEEE 754 de 64 bits. 0.1 + 0.2 = 0.30000000000000004. Inteiros acima de 2^53 − 1 perdem precisão; guarde IDs snowflake como string. |
|---|
| Chaves duplicadas | A spec chama de comportamento indefinido. A maioria dos parsers fica com a última ocorrência. O diff mostra todas, que costuma ser o que você quer ao auditar arquivos de configuração. |
|---|
| Codificação | Apenas UTF-8. A RFC 8259 proíbe um BOM UTF-8 no começo do documento; alguns parsers aceitam mesmo assim, mas a spec não. |
|---|
| Null vs ausente | Uma chave com valor null está presente. Uma chave ausente não está. Diferente do undefined do JavaScript, que não tem representação em JSON. |
|---|
JSON diff: perguntas frequentes
Isso salva ou faz upload do meu JSON em algum lugar?
Não. O diff roda inteiramente no seu navegador. Nada é enviado para um servidor, registrado em log, ou armazenado. Cole uma resposta de API interna ou uma política IAM e feche a aba; não fica cópia em lugar nenhum. Para conferir, abra o DevTools, vá na aba Rede e observe: não tem nenhuma requisição saindo quando você compara.
Reordenar chaves ou aplicar pretty-print no JSON aparece como mudança?
Sim, os dois aparecem. Um diff de texto compara caracteres linha por linha, então reformatação, reordenação de chaves ou mudanças de espaço aparecem como diferenças mesmo quando os dados são idênticos. Clique no botão Format nos dois painéis primeiro, e o diff foca em mudanças reais nos dados. Para uma comparação totalmente estrutural que ignora ordem de chaves, ordene as chaves dos dois lados antes de comparar.
A ordem das chaves num objeto JSON importa?
Para chaves de objeto, não: a spec do JSON diz que objetos não são ordenados, então {"a":1,"b":2} e {"b":2,"a":1} representam os mesmos dados. Um diff por caractere ainda vai sinalizar a reordenação, por isso o botão Format importa. Arrays são diferentes: [1,2,3] e [3,2,1] não são iguais porque a ordem do array tem significado em JSON.
Por que 0.1 + 0.2 não é igual a 0.3 no meu diff?
Por causa do ponto flutuante IEEE 754. 0.1 + 0.2 é, na real, 0.30000000000000004, e JSON.parse lê números como floats de 64 bits. Inteiros grandes batem no mesmo limite: qualquer coisa acima de 2^53 - 1 (9007199254740991) perde precisão, então um ID estilo snowflake do Twitter não sobrevive ao round-trip. Se a precisão importa, guarde como string.
Posso colar JSON com comentários ou vírgulas no final?
O JSON padrão não permite nenhum dos dois. { "a": 1, } ou // comentário vão dar erro de parse. Isso é JSON5 ou JSONC (o formato que o VS Code usa para settings.json), que é um superset. Tire os comentários e as vírgulas finais antes. A gente segue de propósito a gramática estrita da RFC 8259 para que o diff bata com o que sua API aceita de fato.
Até que tamanho de JSON dá pra comparar antes de ficar lento?
Até alguns MB tudo bem, em menos de um segundo. Passando dos 10 MB o navegador começa a sentir, principalmente porque renderizar o diff (não calcular) é o que fica caro. Para exports de 50 MB ou mais, filtre os dois lados para a subárvore que te interessa com jq primeiro, e cole isso.
Privacidade e como isso funciona
Seu JSON nunca sai do seu navegador. O parser, o formatador e o diff rodam todos na sua máquina, localmente. Sem analytics no que você cola, sem logs, sem ida e volta "útil" pra nuvem. O parsing usa o JSON.parse nativo do navegador, e a spec de JSON que a gente segue é a RFC 8259.