Comparador de JSON (Diff)

Cole dois documentos JSON e veja exatamente o que mudou entre eles - cada chave adicionada, removida ou alterada, em qualquer profundidade, identificada pelo caminho exato como user.address.city ou items[2].price. Diferente de um diff de texto comum, a ordem das chaves e a formatação de espaços em branco nunca contam como diferença aqui - só os dados reais importam.

4 diferenças+2 adicionado~2 alterado
  • Adicionadodiscontinued

    + false

  • Alteradoprice

    − 19.99

    + 24.99

  • Adicionadotags[2]

    + "sale"

  • Alteradoversion

    − "1.2.0"

    + "1.3.0"

Comparação por estrutura, não por linha - reordenar chaves ou reformatar espaços nunca aparece como diferença, apenas mudanças reais nos dados.

Perguntas frequentes

Qual a diferença disso para um diff de texto comum?

Um diff de texto (como o próprio Comparador de Diferenças de Texto deste site) compara dois blocos de texto linha por linha - ele não sabe o que é JSON, então reformatar um documento, reordenar suas chaves ou mudar a indentação mostra uma parede de linhas alteradas mesmo quando os dados subjacentes são idênticos. Esta ferramenta analisa os dois lados como JSON de verdade primeiro, depois compara as estruturas resultantes - então {"a":1,"b":2} e uma versão formatada com "b" listado antes de "a" são corretamente reportadas como sem diferenças. Só adições, remoções e mudanças de valor reais são mostradas.

Qual a diferença entre um valor "alterado" e um com "tipo alterado"?

"Alterado" significa que o valor naquele caminho ainda é do mesmo tipo JSON mas tem um valor diferente - um número que foi de 5 para 6, ou uma string que foi de "rascunho" para "publicado". "Tipo alterado" significa que o próprio tipo é diferente - um campo que era booleano agora é uma string, ou um número virou null. Essa distinção importa muito na prática: uma mudança de tipo tem muito mais chance de quebrar código que lê aquele campo (uma função esperando um booleano vai se comportar mal se de repente receber uma string), então esta ferramenta sinaliza isso separadamente em vez de misturar com uma atualização de valor comum.

Como os arrays são comparados?

Item por item, em ordem: índice 0 contra índice 0, índice 1 contra índice 1, e assim por diante, com qualquer item extra no final do array mais longo reportado como adicionado ou removido. Isso é simples e previsível, mas significa que inserir um novo item no meio de um array vai fazer todos os itens seguintes parecerem alterados, mesmo que sejam na verdade idênticos - porque todos foram deslocados uma posição. Essa é uma limitação real da comparação de arrays baseada em posição em geral (não só desta ferramenta), então para arrays cuja ordem pode mudar, geralmente ajuda verificar se os itens reportados como "alterados" são realmente diferentes ou só foram deslocados.

O que acontece se meu JSON for inválido?

O erro de análise exato produzido pelo próprio analisador JSON do seu navegador é exibido embaixo daquela caixa de texto, em vez de falhar silenciosamente ou mostrar um resultado desatualizado. Causas comuns são uma vírgula sobrando depois do último item de um objeto ou array (válida em literais de objeto do JavaScript, inválida em JSON), aspas faltando ao redor de um nome de chave, ou um comentário perdido - JSON não tem sintaxe de comentário nenhuma, diferente de JavaScript ou JSON5.

Posso usar isso para comparar respostas de API?

Sim, e é um dos usos mais úteis: cole uma resposta capturada antes de uma mudança e outra capturada depois, e cada campo que foi adicionado, removido ou - crucialmente - mudou de tipo fica sinalizado. Um campo mudando silenciosamente de número para string, ou de booleano para null, é exatamente o tipo de mudança que quebra tudo e é fácil de passar despercebida a olho nu em dois payloads grandes, mas aqui aparece imediatamente como uma entrada distinta de "tipo alterado".

A ordem em que as chaves aparecem importa?

Não, nunca - dois objetos JSON com as mesmas chaves e valores são tratados como idênticos não importa em que ordem essas chaves estejam escritas, já que o próprio JSON não define nenhum significado para a ordem das chaves. Isso também significa que um documento JSON minificado em uma linha só e uma versão bem indentada dos mesmos dados exatos vão mostrar corretamente zero diferenças aqui.

Meus dados JSON são enviados para algum lugar?

Não. Os dois documentos são analisados e comparados inteiramente no seu navegador usando JavaScript puro - nada é enviado a um servidor, então é seguro colar respostas reais de API, arquivos de configuração ou outros dados que você não gostaria que saíssem da sua máquina.

Posso comparar arquivos JSON muito grandes?

Ele lida confortavelmente com respostas de API e arquivos de configuração típicos - de algumas linhas a vários milhares - já que toda a comparação roda de forma síncrona na sua aba do navegador. Para documentos realmente enormes (dezenas de megabytes), a varredura recursiva por cada chave e índice de array pode ficar lenta o suficiente para notar; se isso acontecer, geralmente ajuda reduzir os dois documentos só para a seção que realmente importa antes de comparar.

Isso pode substituir um git diff para arquivos de configuração JSON?

Eles respondem perguntas diferentes e funcionam bem juntos em vez de como substitutos. Um diff de controle de versão é textual - mostra as linhas exatas que mudaram no arquivo, incluindo uma reformatação, uma reindentação, ou um linter reordenando chaves, nada disso é considerado uma diferença real por esta ferramenta. Esta ferramenta responde uma pergunta mais específica, geralmente mais útil depois que um formatador ou um arquivo gerado automaticamente mexeu em algo: a configuração realmente mudou, ou só o formato dela mudou? Rodar as duas juntas em um commit suspeito é uma forma rápida de distinguir "nada com que se preocupar, só foi reformatado" de "isso realmente muda o comportamento".

E se os dois documentos tiverem tipos raiz diferentes, tipo um array contra um objeto?

Ainda funciona - se o nível mais alto em si difere em formato (um objeto de um lado, um array do outro, ou um valor primitivo contra qualquer um dos dois), isso é reportado como uma única diferença no nível raiz em vez de a ferramenta forçar uma comparação que não faz sentido. A mesma lógica que sinaliza a mudança de tipo de um campo aninhado se aplica à raiz: é tratado como o tipo mais fundamental de diferença que dois documentos JSON podem ter.

Isso também valida ou formata meu JSON?

Só como efeito colateral - cada lado é analisado para ser comparado, então um documento inválido mostra um erro de análise em vez de comparar silenciosamente nada. Mas o trabalho desta ferramenta é comparar dois documentos que já são JSON válido, não reformatar ou corrigir automaticamente um deles. Se você precisa validar, reformatar ou minificar um único documento JSON, o Formatador e Validador de JSON deste site foi feito especificamente para isso e é um primeiro passo natural antes de colar um documento aqui.

Ferramentas relacionadas