Ir al contenido principal
CuteJSON
↑↓ Navegar Enter Seleccionar Esc Cerrar

Como comparar dos documentos JSON por lo que significan, no por como se ven

Publicado 2 min de lectura Por Akash Kinkar Pandey

Un diff de texto en JSON reporta lo incorrecto mas a menudo de lo que reporta lo correcto. Reindentar un archivo, o mover una propiedad de la parte inferior a la superior, y un diff basado en lineas se ilumina como docenas de lineas cambiadas aunque los datos son identicos. Lo que realmente quieres saber es si los valores cambiaron, no si los bytes lo hicieron.

Usar la herramienta de diff JSON

Pega el documento original en Antes y el cambiado en Despues, luego presiona Comparar. Cada diferencia en el resultado lleva la camino del valor y ambos lados del cambio, para que este leyendo “$.b cambio de “x” a “y”“ en lugar de contar signos mas y menos.

Comparar

{"a":1,"b":"x","c":true,"nested":{"n":1.0}}

contra

{"b":"y","c":true,"d":"new","nested":{"n":1}}

reporta exactamente tres diferencias: $.a eliminado, $.b cambio de "x" a "y", y $.d agregado. Nada mas. $.c es identico y no aparece. $.nested.n tampoco aparece, porque 1.0 y 1 significan el mismo numero.

Como los objetos y arreglos se comparan de manera diferente, a proposito

Los objetos se tratan como desordenados, porque eso es lo que la especificacion JSON dice que son: un conjunto de pares de nombre y valor sin un orden definido. Reordenar las claves de un objeto no es un cambio aqui, y una herramienta de diff que lo reportara como uno estaria reportando sobre formato, no sobre datos.

Los arreglos se comparan por posicion, ya que esa es la unica lectura honesta disponible. La herramienta no puede saber si insertaste un elemento en el medio de una lista o reescribiste cada elemento despues de el, por lo que no adivina. Insertar un elemento cerca del inicio de un arreglo largo aparecera como muchos cambios posicionales, que es correcto aunque parezca sorprendente la primera vez.

Que cuenta como igual

1 y 1.0 son el mismo valor, y dos ortografias diferentes de un escape en una cadena son la misma cadena. El unico lugar donde esto se vuelve estricto son los enteros largos: dos numeros de veinte digitos tienen que coincidir digito por digito antes de ser llamados iguales, porque un doble de JavaScript no puede representarlos unicos y un diff que tratara silenciosamente dos IDs largos diferentes como el mismo numero estaria activamente mal. Las tres reglas estan declaradas en la pagina, porque un diff que decide silenciosamente es uno en el que no puedes actuar.

Intercambiar lados

Si pegaste los documentos en el orden incorrecto, Intercambiar lados da vuelta la comparacion sin reescribir nada, lo que tambien cambia contra que lado se reporta una adicion o eliminacion.

Volver a todas las entradas