Diff JSON
Compare dois documentos JSON e veja exactamente que campos foram adicionados, removidos ou alterados
JSON A (esquerda / antes)
JSON B (direita / depois)
Diff JSON
Compare dois documentos JSON e veja exactamente que campos foram adicionados, removidos ou alterados
Recursos
- Diff estrutural entre dois valores JSON — objectos, arrays e primitivos são percorridos correctamente (null é tratado como escalar, não objecto, corrigindo o bug typeof null)
- Cada diferença é reportada como um caminho JSON Pointer RFC 6901 (p. ex. `/users/0/email`) para navegar directamente ao nó exacto em dados profundamente aninhados
- Entradas modificadas mostram valores antes E depois lado a lado, por isso é óbvio se 'active' passou de true→false ou se um número mudou
- Contadores resumo: adicionados, removidos, modificados e folhas inalteradas — escala do diff num relance antes de ler o detalhe por caminho
- Relatório de erro de análise por lado nomeia que entrada falhou e inclui a mensagem de parsing do motor JavaScript — não tem que adivinhar se A ou B está malformado
- O botão Copiar relatório emite o diff completo (secções Adicionados / Removidos / Modificados mais contador inalterado) como texto simples — cole em revisão de código ou mensagem de commit
- Carregar exemplo preenche ambos os painéis com um pequeno exemplo realista (registo de utilizador com alterações de papel + endereço) para utilizadores iniciantes verem o diff sem escrever nada
- Puramente do lado cliente: JSON A e JSON B são analisados e comparados no seu navegador; nada é enviado, e a ferramenta funciona offline após o carregamento
Como usar
- Cole o seu JSON «antes» na área de texto esquerda (JSON A) e o JSON «depois» à direita (JSON B).
- Clique Comparar. O diff é calculado recursivamente; objectos por chave, arrays por índice.
- Leia os contadores: quantas chaves adicionadas, removidas, modificadas, e quantas folhas combinaram.
- Percorra as listas por caminho para ver que caminhos JSON Pointer mudaram; linhas modificadas mostram antes → depois.
- Clique Copiar relatório para obter todo o diff em texto simples — útil para notas de revisão, relatórios de bug ou mensagens de commit.
- Use Carregar exemplo para ver um exemplo funcional antes de colar os seus dados.
Dicas e Melhores Práticas
- Passe ambos os lados por JSON Formatter primeiro se quiser que um diff de texto também veja documentos estruturalmente iguais como sem alteração.
- Para arrays grandes onde a ordem importa, esta ferramenta é exactamente certa; para conjuntos, pré-ordene por uma chave estável.
- A saída de caminho é RFC 6901, por isso pode passá-la directamente a bibliotecas como fast-json-patch para aplicar alterações programaticamente.
- Cole o relatório em descrições de PR para mostrar a revisores exactamente o que mudou num JSON de config ou fixture.
- Se erros de análise apontam para uma coluna específica, a mensagem do motor inclui frequentemente linha/coluna de parsers tipo json5 — aqui usamos JSON.parse estrito, por isso linha/coluna vem do host.
Perguntas Frequentes
Como são comparados os arrays — por índice ou por valor?
Por índice. O elemento 0 de A é comparado com o 0 de B, 1 com 1, etc. Se A for mais longo, os índices extra são reportados como Removidos; se B for mais longo, a cauda extra é Adicionada. Rápido e previsível, mas uma inserção no início de um array grande cascateia em muitas entradas «modificado». Para comparações insensíveis à ordem (conjuntos de IDs únicos), ordene ambos os arrays primeiro ou pré-processe para objectos indexados pelo identificador.
Que notação de caminho está no resultado?
JSON Pointer RFC 6901: caminhos são tokens separados por barras que descem na árvore JSON. `/users/0/email` significa «a propriedade email do elemento 0 de users». Chaves com `~` são escapadas como `~0`, barras como `~1`. A raiz é mostrada como `/`. Mesma notação usada por ferramentas de patch, JSON Schema instancePath e hover do pointer no json-formatter.
Como é tratado null?
null é tratado como valor folha, não objecto — embora typeof null === 'object' em JavaScript. Por isso {a: null} vs {a: {}} aparece como modificado em vez de recursar para um objecto vazio. {a: null} vs {a: null} conta como uma folha inalterada, e {a: null} vs {a: 0} aparece como modificado com antes=null depois=0.
O diff lida com chaves com caracteres especiais?
Sim. Chaves com pontos, barras, parênteses ou tils são escapadas JSON-Pointer na saída de caminho — `~` torna-se `~0`, `/` torna-se `~1`. Uma chave literalmente chamada `a/b` aparece como `/a~1b` no caminho, inequivocamente reversível.
Porque é que o contador inalterado não bate com a minha expectativa?
Inalterado é contado ao nível de FOLHA — primitivos iguais entre A e B. Um objecto profundamente aninhado cuja subárvore é totalmente idêntica contribui com uma entrada inalterada por folha, não uma para toda a subárvore. Isto torna o contador uma verdadeira verificação: «quantos valores primitivos se mantiveram».
O que acontece se um lado for null ou vazio?
Entrada vazia parsa como null (por isso `{a:1}` vs vazio compara contra null e reporta todo o objecto como adicionado). Um `null` literal é um documento JSON válido; comparar dois nulls dá zero adicionados/removidos/modificados e um inalterado. Se ambas as entradas estiverem vazias, o diff reporta trivialmente zero em todo o lado.
O meu JSON é enviado para algum lado?
Não. Ambas as áreas de texto ficam no seu navegador; o diff corre no mesmo contexto JavaScript que renderizou a página. O separador Rede do DevTools não mostra pedidos ao clicar Comparar. A ferramenta funciona offline após cache da página.
Em que difere de um diff de texto por linha?
Um diff de texto como `diff a.json b.json` opera sobre caracteres e quebras de linha: reformate os mesmos dados e ele acende. Este é um diff ESTRUTURAL: `{"a":1, "b":2}` e `{"b":2, "a":1}` são idênticos (zero diff). Também não se importa com indentação, espaços finais ou estilos de comentário. Use diff de texto se a formatação importa; este se os dados importam.