Comparador de JSON

Cole dois JSON, por exemplo a resposta esperada e a resposta obtida de uma API, e veja exatamente o que mudou: campos adicionados, removidos, valores alterados e mudanças de tipo, cada um com o caminho até o campo. A comparação é feita no seu navegador.

Diferenças (caminho no formato $.campo[índice])

    Como usar

    1. Cole o JSON original (ou esperado) no campo A e o novo (ou obtido) no campo B.
    2. Clique em Comparar.
    3. Leia a lista de diferenças: cada linha mostra o tipo da mudança, o caminho do campo e os valores antes e depois.
    4. Use Inverter A e B para ver a comparação no sentido contrário e Copiar relatório para colar o resultado em um bug ou pull request.

    Exemplo

    JSON A:

    {"id": 7, "status": "ativo", "cliente": {"nome": "Ana", "email": null},
     "itens": [{"sku": "A1", "qtd": 1}, {"sku": "B2", "qtd": 2}], "cupom": "QA10"}

    JSON B:

    {"id": 7, "status": "inativo", "cliente": {"nome": "Ana"},
     "itens": [{"sku": "A1", "qtd": "1"}], "frete": 0}

    Relatório:

    ~ $.status: "ativo" → "inativo"
    - $.cliente.email: null
    ~ $.itens[0].qtd: tipo número → texto (1 → "1")
    - $.itens[1]: {"sku":"B2","qtd":2}
    - $.cupom: "QA10"
    + $.frete: 0

    Repare em duas diferenças que passam despercebidas numa leitura rápida: o campo email deixou de existir (não virou null, sumiu) e a quantidade passou de número para texto.

    Como funciona

    Os dois textos são validados com JSON.parse. Depois a ferramenta percorre as duas estruturas em paralelo, recursivamente:

    • Objetos: compara chave a chave, sem considerar a ordem. Uma chave que só existe em A é removida; uma que só existe em B é adicionada.
    • Arrays: compara posição a posição, porque em JSON a ordem dos itens faz parte do dado. Itens a mais em B são adicionados; itens a menos são removidos.
    • Tipos diferentes no mesmo caminho (número e texto, objeto e array, null e 0) são reportados como tipo alterado.
    • Valores simples (texto, número, booleano, null) são comparados por igualdade estrita.

    O caminho segue a notação usada em JSONPath: $ é a raiz, .campo acessa uma chave e [0] um item de array. Chaves com espaço ou caracteres especiais aparecem entre colchetes, como $["nome completo"].

    Uso em QA e desenvolvimento

    • Testes de regressão de API: comparar a resposta atual com a de uma versão anterior.
    • Investigar falhas de asserção em testes de contrato, quando a mensagem do framework mostra os dois objetos inteiros.
    • Comparar respostas de ambientes diferentes (homologação e produção) para o mesmo pedido.
    • Revisar mudanças em arquivos de configuração, fixtures e massa de dados.
    • Documentar no bug exatamente quais campos divergem, em vez de anexar dois JSON longos.

    Formatação e ordem

    Com a opção Ignorar diferenças de formatação marcada (padrão), espaços, quebras de linha e ordem das chaves não contam: só o conteúdo. Desmarcando, quando o conteúdo é igual mas o texto não, a ferramenta avisa que a diferença é apenas de formatação.

    Limitações

    • Arrays são comparados por posição. Se um item for inserido no início, todos os seguintes aparecem como alterados. Ordenar os dois arrays antes ajuda quando a ordem não importa para o seu caso.
    • A lista mostra até 5.000 diferenças, para manter o navegador responsivo.
    • Números acima de 9.007.199.254.740.991 perdem precisão no JavaScript; dois IDs longos muito parecidos podem ser vistos como iguais. Compare-os como texto.
    • 1 e 1.0 são o mesmo número em JSON e não geram diferença.

    Perguntas frequentes

    Campo ausente e campo com null são a mesma coisa?

    Não, e a ferramenta separa os dois. Muitas APIs tratam “não informado” e “informado como vazio” de formas diferentes, então essa distinção costuma revelar bugs de serialização.

    Por que “1” e 1 aparecem como diferença?

    Porque são tipos diferentes em JSON: um é texto e o outro é número. Para um cliente tipado, essa mudança pode quebrar a desserialização mesmo com o valor “igual”.

    Posso comparar respostas muito grandes?

    Sim, até cerca de 2 milhões de caracteres somando as duas entradas. Acima disso, a ferramenta recusa para não travar a aba.

    Os JSON são enviados para algum servidor?

    Não. A comparação roda no JavaScript da página e nada é registrado. Prefira dados fictícios mesmo assim.

    Ferramentas relacionadas

    Referências