Que Cambio Entre Estos Dos Documentos
El diff entre el objeto original y el modificado muestra cinco cambios:
agecambio de30a31emailcambio dealice@example.comaalice@newdomain.comrolesgano un tercer elemento:"viewer"settings.themecambio de"dark"a"light"settings.languagese agrego con el valor"en"
name, settings.notifications y la estructura general permanecieron igual.
Diff JSON Textual vs Semántico
Un diff textual compara dos documentos como strings, línea por línea. Esto funciona bien cuando ambos documentos están formateados de manera consistente (misma indentación, mismo orden de claves). Si el orden de las claves difiere entre los dos documentos, un diff textual marcara cada línea como cambiada aunque los datos sean iguales.
Un diff semántico primero analiza ambos documentos, luego compara las estructuras de datos. No le importa el orden de las claves, los espacios o la indentación. Reporta los cambios en terminos de rutas y valores: age cambio de 30 a 31, no la línea 3 cambio.
Para comparar documentos JSON de diferentes fuentes (diferentes APIs, diferentes serializadores), el diff semántico es más confiable. Para rastrear cambios en un archivo JSON bajo control de versiones donde el formato es consistente, el diff textual (como se muestra aquí) funciona bien y es inmediatamente legible.
Preparar JSON para un Diff Textual Limpio
Antes de hacer diff de dos documentos JSON como texto, formatea ambos con la misma configuración. La indentación inconsistente o el orden de claves diferente producira diffs ruidosos donde cada línea parece haber cambiado.
Formatear con indentación consistente usando jq:
jq --sort-keys . original.json > original_formatted.json
jq --sort-keys . modified.json > modified_formatted.json
diff original_formatted.json modified_formatted.json
La bandera --sort-keys ordena las claves de los objetos alfabeticamente. Si ambos documentos se ordenan de la misma manera, las diferencias en el orden de las claves no apareceran en el diff.