Diff de JSON

Cole dois documentos JSON — os caminhos alterados aparecem na hora, sem botão, sem upload.

Como usar

  1. Cole o JSON antigo em “JSON original” e o novo em “JSON alterado” — cada caminho adicionado, removido ou alterado aparece enquanto você digita, sem botão para clicar.
  2. Ordem de chaves, 1 vs 1.0, 1e0 vs 1 e \u00e9 vs é não são diferenças: a comparação é estrutural. Se precisar revisar formatação ou ordem de chaves, use a ferramenta de diff de texto.
  3. Use “Copiar diff” para levar a lista completa: cada linha é +, - ou ~ seguida do caminho e do valor completo, pronta para um chamado ou e-mail.

Exemplo

Dois documentos

【Original】
{"pedido":"A-2026-001","cliente":{"nome":"Ana","cidade":"São Paulo"},"total":1299.5,"pago":false}

【Alterado】
{"pedido":"A-2026-001","cliente":{"nome":"Ana","cidade":"Recife"},"total":1399.0,"pago":true,"cupom":"BEMVINDO10"}

Diferenças

+ $.cupom "BEMVINDO10"
~ $.cliente.cidade "São Paulo" → "Recife"
~ $.total 1299.5 → 1399.0
~ $.pago false → true
(+1 ~3 −0)

As linhas 【Original】/【Alterado】 são títulos de exemplo; no uso real os dois documentos vão para as duas caixas de entrada. Apenas mudanças reais de valor são listadas: o número do pedido e o nome do cliente, inalterados, não aparecem, e a ordem das chaves nunca é uma diferença.

Regras, limites e problemas conhecidos

  • Este é um diff estrutural, não um diff de texto: a ordem das chaves de objeto é ignorada; 1, 1.0 e 1e0 são o mesmo número; "\u00e9" e "é" são a mesma string. Use a ferramenta de diff de texto se mudanças de formatação importarem.
  • Números são comparados como decimais exatos, nunca pelo Number do JavaScript: 9007199254740993 permanece exato e 1e400 não vira Infinity. A lista ainda mostra o número exatamente como você digitou.
  • Strings são comparadas pelo valor decodificado e exibidas na forma JSON padrão; chaves duplicadas mantêm o último valor, como o JSON.parse faz, e um aviso informa quantas duplicatas foram encontradas.
  • Arrays são ordenados: inserções e exclusões são alinhadas, então acrescentar um item no topo é uma linha “+”, não uma mudança em todos os itens seguintes. Movimentações aparecem como uma remoção mais uma adição, e não há opção “ignorar ordem do array”.
  • Adicionar ou remover uma subárvore inteira é um único caminho. Valores muito longos aparecem na tela como “objeto · N chaves” ou “array · N itens”, enquanto “Copiar diff” sempre contém o valor completo.
  • “Copiar diff” produz uma lista de mudanças em texto simples (+ / - / ~, caminho, valor completo), não um JSON Patch. Inserções e exclusões em arrays deslocam os índices seguintes, então um JSON Patch ingênuo não se aplicaria.
  • Os caminhos usam a forma $.a.b[0]. Itens removidos apontam para o índice antigo; itens adicionados e alterados apontam para o documento novo.
  • Limites: os resultados são atualizados cerca de 0,6 s depois de você parar de digitar acima de 200.000 caracteres somados; um documento com mais de 1.000.000 de caracteres ou aninhamento acima de 256 níveis é reportado como erro, nunca truncado. Arrays acima do limite de alinhamento são comparados por índice e um aviso diz isso; no máximo 400 linhas de mudança são renderizadas, mas copiar sempre traz a lista completa.
  • Sem upload de arquivo, sem carregar URL, sem consulta JSON Schema ou JSONPath, sem histórico e sem links de compartilhamento. Tudo roda no seu navegador: nada é enviado ou armazenado.
  • Em páginas em chinês, japonês e coreano, “Pontuação de largura total” vem ativada por padrão: a pontuação fora das strings é convertida para ASCII, enquanto o conteúdo das strings fica exatamente como digitado.

O que as pessoas costumam precisar depois de comparar os dois documentos.