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

  1. Cole o seu JSON «antes» na área de texto esquerda (JSON A) e o JSON «depois» à direita (JSON B).
  2. Clique Comparar. O diff é calculado recursivamente; objectos por chave, arrays por índice.
  3. Leia os contadores: quantas chaves adicionadas, removidas, modificadas, e quantas folhas combinaram.
  4. Percorra as listas por caminho para ver que caminhos JSON Pointer mudaram; linhas modificadas mostram antes → depois.
  5. 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.
  6. 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.