JSON Diff: compara dos documentos JSON por estructura

Compara dos JSON por estructura y valor, no como texto. Detecta ADDED, REMOVED y CHANGED con la ruta exacta e ignora el orden de claves y la sangría.

Entrada

Dos JSON pueden parecer completamente distintos en un diff de texto y contener exactamente los mismos datos: basta con que un servicio serialice las claves en otro orden o use dos espacios de sangría en lugar de cuatro. Esta herramienta compara los documentos por su forma y sus valores, así que ese ruido desaparece. Lo que obtienes es una lista de diferencias reales, cada una con su ruta exacta dentro del documento y una etiqueta que indica si el valor se añadió, se eliminó o cambió.

Qué es una comparación estructural de JSON

Una comparación estructural no enfrenta caracteres, sino datos. La herramienta interpreta ambos documentos y los contrasta por forma y valor: si el contenido coincide, el resultado es «estructuralmente idénticos», aunque las claves de los objetos estén en distinto orden o la sangría no sea la misma. Cuando existe una diferencia real, se comunica con una ruta precisa —del estilo pedido.lineas[2].precio— y una etiqueta ADDED, REMOVED o CHANGED. Así sabes qué cambió y dónde sin revisar el archivo línea por línea.

Cómo funciona la comparación de JSON

Ambos lados se analizan con JSON.parse y luego se recorren en profundidad en paralelo, de modo que la comparación se hace sobre el modelo de datos y no sobre el texto. La RFC 8259 define un objeto como una colección sin orden, y por eso aquí un cambio de orden de claves o de sangría se informa como idéntico, mientras que un diff por líneas lo marcaría como cambio. Las claves presentes en un solo lado pasan a AÑADIDO o ELIMINADO; los arreglos se emparejan por índice, así que una inserción cerca del principio desplaza todo lo posterior y aparece como una serie de cambios en lugar de un movimiento. Las hojas se comparan por tipo y valor, lo que convierte 30 frente a "30" en una diferencia real. Las rutas se imprimen con puntos y corchetes (user.tags[1]), reflejando la idea de JSON Pointer de direccionar un nodo dentro del documento.

Qué hace esta herramienta

Compara por estructura y valor, no como texto: reordenar las claves de un objeto o cambiar la sangría no produce falsos positivos.
Recorre los documentos en profundidad hasta cada hoja y devuelve una ruta exacta del tipo x.y[1] para cada diferencia.
Clasifica cada diferencia como ADDED (solo a la derecha), REMOVED (solo a la izquierda) o CHANGED (presente en ambos con distinto valor o tipo).
Recorta los valores mostrados a 60 caracteres, de modo que un campo largo no rompa la legibilidad del listado ni del resumen.

Cómo usar el comparador

1

Pega en el campo de la izquierda el documento de referencia: la versión anterior, la respuesta esperada o el fixture original.

2

Pega en el campo de la derecha el documento que quieres contrastar: la nueva respuesta de la API, el archivo tras la migración o la salida de otro entorno.

3

Consulta el estado: te dice de inmediato si los dos documentos son estructuralmente idénticos o si hay diferencias.

4

Recorre la lista de diferencias y usa la ruta de cada línea (por ejemplo datos.items[0].precio) para localizar el punto exacto en tu código o en tu payload.

Errores frecuentes

Esperar un diff línea a línea. Aquí no verás bloques de texto marcados: verás rutas y valores, porque la comparación ocurre sobre los datos ya interpretados.
Dar por hecho que los arrays se comparan por contenido. Se comparan por índice, así que mover un elemento al principio de una lista genera diferencias en todas las posiciones siguientes.
Pasar por alto el tipo. 7 y "7" se ven casi igual en pantalla, pero el número y la cadena son valores distintos y se reportan como CHANGED.

Ejemplos

{"a":1,"b":2} frente a {"b":2,"a":1} → estructuralmente idénticos, 0 diferencias (el orden de las claves no cuenta).
{"user":{"id":7}} frente a {"user":{"id":"7"}} → CHANGED en user.id: 7 → "7" (cambio de tipo).
{"tags":["rojo","azul"]} frente a {"tags":["rojo"],"activo":true} → REMOVED en tags[1]: "azul" y ADDED en activo: true.

Ver también

  • Formateador JSON¿Uno de los lados no se analiza? Formatéalo antes: el formateador señala el carácter culpable.
  • CSV a JSON¿Comparas dos exportaciones de hoja de cálculo? Pásalas a JSON y compáralas por estructura.

Preguntas frecuentes

¿Por qué dice que los documentos son idénticos si el texto no coincide?

Porque la comparación es estructural: primero se interpretan los dos documentos y después se contrastan los datos resultantes. El orden de las claves dentro de un objeto y la sangría no forman parte de los datos, así que dos textos distintos con el mismo contenido se reportan como estructuralmente idénticos.

¿Cómo se comparan los arrays?

Por posición: el elemento 0 de la izquierda se compara con el elemento 0 de la derecha, el 1 con el 1, y así sucesivamente. Si insertas un elemento al principio, todos los índices posteriores quedan desplazados y aparecerán como CHANGED, además de un ADDED o REMOVED por la diferencia de longitud.

¿Por qué marca CHANGED si el valor parece el mismo?

Porque en JSON el tipo forma parte del valor. El número 7 y la cadena "7" ocupan la misma ruta pero no son el mismo dato, igual que true y "true", así que el cambio de tipo se reporta como CHANGED junto con los dos valores.

¿Por qué algunos valores aparecen cortados?

Cada valor mostrado en el listado se recorta a 60 caracteres para mantener la lectura ágil. La comparación se hace siempre sobre el valor completo: el recorte es solo visual y afecta a lo que ves, nunca al resultado.