Saltar al contenido

🔍 JSON Diff (Comparación Estructural)

Compara dos JSON estructuralmente y muestra adiciones, eliminaciones y cambios con rutas JSON Pointer. Soporta orden de claves, orden de arrays y cambios de tipo.

100% Gratis Sin registro Solo navegador 5 idiomas Modo oscuro

🔒 Sobre la privacidad

Resultado del Diff

🔗 Herramientas relacionadas

📖 Dónde se suele tropezar

Compara dos documentos JSON como estructuras e informa de altas, bajas y cambios con un JSON Pointer para cada uno. Todo se ejecuta en el navegador. Mira algo distinto que un diff de texto: las diferencias de sangrado o de saltos de línea no son diferencias aquí. A la inversa, dos documentos idénticos carácter por carácter pueden diferir estructuralmente, y también ocurre lo contrario: si no entiendes esa frontera, leerás mal el resultado.

Caso Qué ocurre Qué hacer
Insertar un elemento al principio marca todos como cambiados Los arrays se emparejan posición contra posición. Inserta un elemento al principio y todo lo que sigue se desplaza uno, produciendo un diff ilegible que dice /0 cambiado, /1 cambiado y uno añadido al final. Un diff de texto puede decir una línea insertada porque calcula una subsecuencia común más larga; la comparación estructural no lo hace. Con unas decenas de elementos, el diff entero se pone en rojo y deja de ser legible. Cambia el orden de array a ignorar: entonces se comparan como conjuntos y una simple reordenación se lee como sin cambios. Eso no te sirve cuando el orden significa algo: pasos, prioridades, clasificaciones. En la práctica lo más eficaz es ordenar ambos lados por id antes de comparar: las respuestas de API a menudo no garantizan orden alguno, y que te muestren esa fluctuación como diferencia no te aporta nada. Como regla al leer diffs: si todas las entradas salen como cambiadas, sospecha primero de un emparejamiento fallido antes de creerte que de verdad cambió todo.
Números idénticos a la vista se marcan, o cambios reales no JSON no distingue enteros de números en coma flotante. 1 y 1.0 se analizan al mismo valor y no producen diferencia, mientras que la cadena "1" y el número 1 son distintos con cambio de tipo estricto. Que una API alterne un campo entre cadena y número no es raro: codificar enteros grandes como cadenas para transportarlos con seguridad es un diseño habitual. El caso peligroso es el contrario: un Number de JavaScript no representa con exactitud enteros por encima de dos elevado a cincuenta y tres, así que 9007199254740993 y 9007199254740992 pasan a ser el mismo valor al analizarse y no se informa de ninguna diferencia. Si sólo quieres tolerar la fluctuación de tipos, pon el cambio de tipo en laxo. Ahora bien, el problema de los enteros grandes afecta a toda comparación que pase por JavaScript, no sólo a esta herramienta. Si los datos llevan identificadores Snowflake, números de versión de instantáneas o importes como enteros en unidad mínima, tendrás que tratar esos campos como cadenas antes de comparar: pasa un reviver al analizador, o sácalos y revísalos aparte. Detectarlo es fácil: desconfía de cualquier valor de más de dieciséis dígitos, ya que dos elevado a cincuenta y tres es 9.007.199.254.740.992, que tiene dieciséis.
La diferencia entre null y clave ausente te trae de cabeza {"a": null} y {} son estructuralmente distintos, así que se informa de una diferencia. Es el comportamiento correcto, pero los sistemas reales a menudo no distinguen ambos casos y acabas con un aluvión de entradas sin sentido. La causa está en los lenguajes: JSON.stringify de JavaScript elimina las claves cuyo valor es undefined, mientras que json.dumps de Python emite None como null. Para expresar el mismo valor ausente, un lado quita la clave entera y el otro deja un null. Al comparar API entre lenguajes, aquí es donde el diff se dispara sin falta. Normaliza a una sola convención antes de comparar. En la práctica, quitar de ambos lados las claves cuyo valor es null es lo más manejable: equipara ausente con nulo, así que hazlo sólo donde esa premisa se sostenga. Nunca normalices cuando una API distingue ambos casos a propósito. En la semántica de PATCH, {"a": null} significa borra a, mientras que omitir la clave significa no toques a (JSON Merge Patch, RFC 7386). Si aplanas esa distinción, una petición de actualización generada a partir de tu diff borrará campos que nunca tocaste. Si normalizar es seguro lo decide siempre la especificación de la API del otro extremo.

JSON Pointer (RFC 6901) tiene reglas de escape: un ~ dentro de una clave se escribe ~0 y una / se escribe ~1. Cualquier diccionario indexado por URLs o rutas de archivo se topa con esto: el puntero a la clave de {"https://example.com/a": 1} es /https:~1~1example.com~1a. Pegar un puntero mostrado directamente en el código y olvidar deshacer el escape te lleva a una ruta completamente distinta. Un apunte más sobre el orden: el orden de claves de un objeto JSON no tiene significado según la especificación, pero la mayoría de analizadores conservan el orden de inserción. Por eso una diferencia de orden de claves es información de que el significado no cambió pero el productor sí, y es una pista útil de que se actualizó una biblioteca o se cambió un serializador: merece la pena entenderla una vez antes de descartarla como ruido.

📖 Cómo usar

  1. 1
    Pegar dos JSON
    Pega la versión antigua a la izquierda y la nueva a la derecha. Los botones de Ejemplo cargan datos.
  2. 2
    Ajustar opciones
    Elige la vista (árbol / plano / unified), si ignorar el orden de claves o arrays y el modo de comparación.
  3. 3
    Revisar el diff
    Las entradas añadidas (+), eliminadas (-) y cambiadas (~) aparecen en colores con la ruta JSON Pointer. El resumen muestra los totales.

❓ Preguntas frecuentes

¿Qué es JSON Pointer?
Notación de ruta separada por barras (RFC 6901) para apuntar a cualquier valor dentro de un JSON. Ejemplo: /users/0/email.
¿Qué cambia al ignorar el orden de arrays?
Los arrays se tratan como conjuntos: el mismo contenido en distinto orden se considera igual. Útil cuando solo importa el contenido.
¿Cómo se comparan "1" (string) y 1 (number)?
En modo Estricto se reportan como cambio; en Flexible se consideran iguales por valor. Útil para tolerar variaciones de tipo en APIs.
🐛 ¿Encontró un problema con esta herramienta?

Gratis, sin registro. Incluso solo los pasos para reproducir ayudan. Los informes van directamente al operador y se usan para corregir.

* Se envía automáticamente la info del navegador (UA / pantalla / idioma / URL) para reproducir