Saltar al contenido principal

Comparar JSON

Esta herramienta es un motor de comparación semántica del lado del cliente que analiza cargas JSON en árboles de sintaxis abstracta, ignorando por completo el orden de las claves y los espacios en blanco insignificantes. Incluye emparejamiento de arrays configurable por clave primaria, una clasificación diferenciada de los cambios de tipo, ejecución en Web Worker que maneja hasta 100 MB de JSON sin congelar la pestaña, exportación y aplicación bidireccional de JSON Patch (RFC 6902) y una fusión de tres vías opcional que une dos ramas respecto a un ancestro común con resolución de conflictos por ruta.

Solo local

Comparación semántica entre izquierda y derecha: se ignoran el orden de claves y los espacios.

Documento izquierdo (original)
0 B1 líneaLín. 1, Col. 1
Documento derecho (modificado)
0 B1 líneaLín. 1, Col. 1
Esperando datos...Atajos: Alt+↓ siguiente, Alt+↑ anterior

No hay diferencias que mostrar

Pega arriba dos documentos JSON. La comparación se ejecuta en un Web Worker y la página sigue respondiendo incluso con datos grandes.

¿Cómo funciona Comparar JSON?

Las herramientas de diff línea a línea estándar (como el clásico diff de Unix ) fallan con JSON porque comparan texto serializado en lugar de datos semánticos. En JSON, el orden de las claves es explícitamente arbitrario según el RFC 8259: {"a":1,"b":2} y {"b":2,"a":1} representan objetos idénticos, y aun así los motores de diff textuales los marcan como líneas contradictorias.

El motor de diff de ToolsByUs lo resuelve trabajando sobre árboles de sintaxis abstracta (AST) ya analizados dentro de un Web Worker aislado . Normaliza las claves de los objetos lexicográficamente e implementa tres algoritmos configurables de emparejamiento de arrays:

  • Emparejamiento por índice: Alinea los elementos del array estrictamente por posición ordinal (predeterminado para listas de primitivos).
  • Emparejamiento por clave: Correlaciona las entidades de una colección mediante un identificador inmutable (p. ej. id o uuid ), de modo que los elementos reordenados de la lista se detecten como modificaciones o movimientos y no como un falso ciclo de borrado y adición.
  • Similitud estructural: Usa emparejamiento bipartito de peso máximo para alinear los objetos con mayor correspondencia de campos.

Los cambios de tipo escalar (como pasar de la cadena "42" al número 42 ) se reconocen como eventos TYPE_CHANGE diferenciados y no como ciclos destructivos de reemplazo.

Muestra de izquierda y derecha

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

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

Salida de ejemplo

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

Muestra de izquierda y derecha → Salida de ejemplo

Muestra de izquierda y derecha

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

Muestra de izquierda y derecha 2

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

Salida de ejemplo

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

¿Qué opciones y casos límite admite Comparar JSON?

Referencia técnica y opciones
ParámetroTipoValor predeterminadoComportamiento y casos límite
Invarianza en el orden de las clavesInvarianteSiempre activadoLas claves de objeto se comparan como conjuntos matemáticos. Las secuencias de claves diferentes no producen cambios en la diferencia.
Coincidencia de array: índiceModoPredeterminadoCoincide estrictamente por índice basado en cero. Ideal para arrays simples de escalares [1, 2, 3].
Coincidencia de array: claveModo'id'Coincide elementos de objeto entre arrays por propiedad de clave primaria definida por el usuario. Evita falsas adiciones al reordenar.
Coincidencia de array: similitudModoPuntuación > 0.4Coincidencia heurística estructural basada en claves compartidas y igualdad de escalares primitivos.
Clase de cambio de tipoCategoríaActivoEtiqueta las transiciones de tipo ('1' -> 1) como operaciones TYPE_CHANGE distintas en lugar de eliminar+agregar.
Límite de memoriaLímite100 MBLímite explícito de carga en el worker que protege contra bloqueos por falta de memoria en la pestaña del navegador.
Fusión de tres víasModoOpcionalBase + El nuestro + El suyo fusionados en la página (límite de 8 MB); los conflictos vuelven al valor ancestro y se resuelven dinámicamente por ruta.

Preguntas frecuentes

¿Por qué el orden de las claves no importa al comparar JSON?

Según la especificación oficial de JSON (RFC 8259, sección 4), los objetos JSON son colecciones no ordenadas de cero o más pares nombre/valor. Como los codificadores JSON (como los diccionarios de Python o la iteración de mapas de Go) serializan las claves en órdenes no deterministas, el diff semántico debe normalizar los órdenes de las claves para eliminar diferencias falsas.

¿Cómo funciona el emparejamiento de arrays por clave?

Al trabajar con arrays de modelos de base de datos o registros de API, los elementos suelen cambiar de orden o borrarse. Al especificar una clave primaria como 'id' o 'uuid', el motor de diff empareja los objetos de la izquierda y de la derecha que tienen el mismo valor de clave sin importar su posición en el array, destacando con precisión las mutaciones de campos en lugar de informar de reemplazos completos del array.

¿Puedo generar un JSON Patch RFC 6902 a partir de este diff?

Sí. ToolsByUs genera arrays de JSON Patch conformes al RFC 6902 (con las operaciones 'add', 'remove', 'replace' y 'move') que puedes copiar con un clic o aplicar directamente a los documentos. El parche garantiza el viaje de ida y vuelta: aplicar el parche generado a tu documento original produce exactamente el documento de destino.

¿Cómo gestiona la fusión de tres vías las ediciones en conflicto?

Cambia a «Fusión de tres vías» y proporciona el ancestro común en Base junto con los documentos de ambas ramas. Los cambios que hizo un solo lado se fusionan automáticamente. Donde ambos lados tocaron la misma ruta, el motor registra un conflicto y la salida fusionada usa el valor de Base hasta que elijas Ours, Theirs o Base para esa ruta — cada elección recalcula la salida al instante, por completo en tu navegador.

¿Se envía mi carga JSON a algún servidor de backend?

No. ToolsByUs es un sitio web estático sin backend. El análisis, el recorrido del AST y la generación del diff se ejecutan 100% dentro del hilo de Web Worker dedicado de tu navegador. Las peticiones de red están completamente deshabilitadas mientras se cargan los documentos, algo verificado con pruebas E2E automatizadas estrictas.

¿Qué tamaño de documento JSON puedo comparar sin que se congele la pestaña?

Como todo el análisis y el recorrido pesados se ejecutan en un Web Worker y las filas se renderizan con scroll virtualizado (en el DOM solo existen los elementos visibles en tu ventana), la interfaz sigue respondiendo con documentos de hasta el límite de 100 MB del worker. Un par de 50 MB sigue llevando decenas de segundos de trabajo real — la diferencia es que puedes hacer scroll, escribir y cancelar mientras se ejecuta, en lugar de mirar una pestaña congelada.

¿Qué más puede hacer Comparar JSON?