Pular para o conteúdo principal

Comparar JSON

Esta ferramenta é um motor de comparação semântica que roda no seu navegador: ele analisa cargas JSON em árvores sintáticas abstratas (AST), ignorando completamente a ordem das chaves e os espaços em branco insignificantes. Ele oferece correspondência configurável de arrays por chave primária, classificação distinta de mudanças de tipo, execução em Web Worker que processa até 100 MB de JSON sem travar a aba, exportação e aplicação bidirecional de JSON Patch RFC 6902 e uma mesclagem de três vias opcional que une dois ramos a partir de um ancestral comum, com resolução de conflitos por caminho.

Só local

Comparação semântica entre esquerda e direita: a ordem das chaves e os espaços são ignorados.

Documento à esquerda (original)
0 B1 linhaLin. 1, Col. 1
Documento à direita (modificado)
0 B1 linhaLin. 1, Col. 1
Aguardando entrada...Atalhos: Alt+↓ próximo, Alt+↑ anterior

Nenhuma diferença para mostrar

Cole dois documentos JSON acima. A comparação roda em um Web Worker para manter a página responsiva mesmo com dados grandes.

Como funciona o Comparar JSON?

Ferramentas de diff linha a linha convencionais (como o clássico diff do Unix ) falham com JSON porque comparam texto serializado em vez de dados semânticos. No JSON, a ordem das chaves é explicitamente arbitrária segundo a RFC 8259: {"a":1,"b":2} e {"b":2,"a":1} representam objetos idênticos, mas motores de diff textuais sinalizam essas linhas como contraditórias.

O motor de diff do ToolsByUs resolve isso operando sobre árvores sintáticas abstratas (AST) já analisadas, dentro de um Web Worker isolado . Ele normaliza as chaves dos objetos em ordem lexicográfica e implementa três algoritmos configuráveis de correspondência de arrays:

  • Correspondência por índice: alinha os elementos do array estritamente pela posição ordinal (padrão para listas de primitivos).
  • Correspondência por chave: correlaciona as entidades da coleção por um identificador imutável (por exemplo, id ou uuid ), garantindo que itens reordenados da lista sejam detectados como modificações ou movimentações, e não como um vai-e-vem espúrio de remoções e adições.
  • Similaridade estrutural: usa pareamento bipartido de peso máximo para alinhar os objetos com a maior correspondência de campos.

Mudanças de tipo escalar (como trocar a string "42" pelo número 42 ) são reconhecidas como eventos TYPE_CHANGE distintos, e não como ciclos destrutivos de substituição.

Exemplo à esquerda vs. à direita

// Left:
{"id": 1, "tier": "free", "name": "Alpha"}

// Right:
{"name": "Alpha", "id": 1, "tier": "pro"}

Exemplo de saída

// Semantic Diff Result:
- tier: "free" (Removed)
+ tier: "pro" (Added)
= id: 1 (Unchanged)
= name: "Alpha" (Unchanged, key order ignored)

Exemplo à esquerda vs. à direita → Exemplo de saída

Exemplo à esquerda vs. à direita

{
  "id": 42,
  "name": "Ada",
  "tags": ["math", "code"],
  "active": true
}

Exemplo à esquerda vs. à direita 2

{
  "name": "Ada Lovelace",
  "id": 42,
  "tags": ["math", "code", "analysis"],
  "active": false
}

Exemplo de saída

[
  {
    "op": "replace",
    "path": "/active",
    "value": false
  },
  {
    "op": "replace",
    "path": "/name",
    "value": "Ada Lovelace"
  },
  {
    "op": "add",
    "path": "/tags/2",
    "value": "analysis"
  }
]

Quais opções e casos-limite o Comparar JSON suporta?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
Invariância à ordem das chavesInvarianteSempre AtivadoAs chaves de objeto são comparadas como conjuntos matemáticos. Sequências de chaves diferentes produzem zero diferenças no diff.
Correspondência de Array: índiceModoPadrãoCorresponde itens estritamente por índice baseado em zero. Ideal para arrays simples de escalares [1, 2, 3].
Correspondência de Array: chaveModo'id'Corresponde itens de objeto entre arrays pela propriedade de chave primária definida pelo usuário. Impede adições falsas em reordenações.
Correspondência de Array: similaridadeModoPontuação > 0.4Correspondência heurística estrutural baseada em chaves compartilhadas e igualdade de escalares primitivos.
Classe de mudança de tipoCategoriaAtivoRotacionar transições de tipo ('1' -> 1) como operações TYPE_CHANGE distintas em vez de delete+add.
Limite de MemóriaLimite100 MBLimite explícito de payload no worker para proteger contra travamentos de falta de memória na aba do navegador.
Mesclagem TrípliceModoOpcionalBase + Nosso + Deles mesclados na página (limite de 8 MB); conflitos retornam ao valor ancestral e são re-resolvidos ao vivo por caminho.

Perguntas frequentes

Por que a ordem das chaves não importa ao comparar JSON?

Segundo a especificação oficial do JSON (RFC 8259, Seção 4), objetos JSON são coleções não ordenadas de zero ou mais pares nome/valor. Como os codificadores JSON (como dicionários do Python ou a iteração de maps do Go) serializam as chaves em ordens não determinísticas, o diff semântico precisa normalizar a ordem das chaves para eliminar diferenças falsas.

Como funciona a correspondência de arrays por chave?

Em arrays de modelos de banco de dados ou registros de API, os itens frequentemente mudam de ordem ou são excluídos. Ao especificar uma chave primária como 'id' ou 'uuid', o motor de diff associa os objetos da esquerda e da direita que têm o mesmo valor de chave, independentemente da posição no array, destacando com precisão as mutações de campo em vez de reportar a substituição do array inteiro.

Posso gerar um JSON Patch RFC 6902 a partir deste diff?

Sim. O ToolsByUs gera arrays de JSON Patch em conformidade com a RFC 6902 (com as operações 'add', 'remove', 'replace' e 'move') que podem ser copiados com um clique ou aplicados diretamente aos documentos. O patch tem ida e volta garantidas: aplicar o patch gerado ao seu documento original produz exatamente o documento de destino.

Como a mesclagem de três vias lida com edições conflitantes?

Mude para 'Three-way merge' e informe o ancestral comum em Base junto com os documentos dos dois ramos. Alterações feitas por apenas um dos lados são mescladas automaticamente. Quando os dois lados mexeram no mesmo caminho, o motor registra um conflito e a saída mesclada usa o valor da base até você escolher Ours, Theirs ou Base para aquele caminho — cada escolha recalcula a saída instantaneamente, inteiramente no seu navegador.

Minha carga JSON é enviada a algum servidor de backend?

Não. O ToolsByUs é um site estático sem backend. A análise, o percurso pela AST e a geração do diff são executados 100% dentro da thread de Web Worker dedicada do seu navegador. Requisições de rede ficam completamente desabilitadas enquanto os documentos são carregados, o que é verificado por testes E2E automatizados rigorosos.

Qual o tamanho de documento JSON que consigo comparar sem travar a aba?

Como toda a análise e o percurso pesados rodam em um Web Worker e as linhas são renderizadas com rolagem virtualizada (apenas os elementos visíveis na sua viewport existem no DOM), a interface continua responsiva em documentos até o teto de 100 MB do worker. Um par de 50 MB ainda leva dezenas de segundos de trabalho real — a diferença é que você pode rolar, digitar e cancelar enquanto ele roda, em vez de ficar olhando para uma aba congelada.

O que mais o Comparar JSON pode fazer?