Aller au contenu principal
CuteJSON
↑↓ Naviguer Enter Selectionner Esc Fermer

Comment comparer deux documents JSON par ce qu'ils signifient, pas par leur apparence

Publie 2 min de lecture Par Akash Kinkar Pandey

Un diff de texte sur JSON signale la mauvaise chose plus souvent qu’il ne signale la bonne. Réindentez un fichier, ou déplacez une propriété du bas vers le haut, et un diff basé sur les lignes s’allume comme des dizaines de lignes modifiées même si les données sont identiques. Ce que vous voulez réellement savoir, c’est si les valeurs ont changé, pas si les octets l’ont fait.

Utiliser l’outil de diff JSON

Collez le document original dans Avant et le modifié dans Après, puis appuyez sur Comparer. Chaque différence dans le résultat porte le chemin de la valeur et les deux côtés du changement, donc vous lisez “$.b a changé de "x" à "y"” au lieu de compter les signes plus et moins.

Comparer

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

contre

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

signale exactement trois différences : $.a supprimé, $.b change de "x" à "y", et $.d ajouté. Rien d’autre. $.c est identique et n’apparaît pas. $.nested.n n’apparaît pas non plus, car 1.0 et 1 signifient le même nombre.

Comment les objets et tableaux sont comparés différemment, à dessein

Les objets sont traités comme non ordonnés, car c’est ce que la spécification JSON dit qu’ils sont : un ensemble de paires nom et valeur sans ordre défini. Réordonner les clés d’un objet n’est pas un changement ici, et un outil de diff qui le signalerait comme tel signalerait sur le formatage, pas sur les données.

Les tableaux sont comparés par position, car c’est la seule lecture honnette disponible. L’outil ne peut pas savoir si vous avez inséré un élément au milieu d’une liste ou réécrit chaque élément après, donc il ne devine pas. Insérer un élément près du début d’un long tableau apparaîtra comme de nombreux changements positionnels, ce qui est correct même si cela surprend la première fois.

Ce qui compte comme égal

1 et 1.0 sont la même valeur, et deux orthographes différentes d’un échappement dans une chaîne sont la même chaîne. Le seul endroit où cela devient strict est les grands entiers : deux nombres de vingt chiffres doivent correspondre chiffre par chiffre avant d’être appelés égaux, car un double JavaScript ne peut pas les représenter de manière unique et un diff qui traiterait silencieusement deux grands IDs différents comme le même nombre serait activement faux. Les trois règles sont indiquées sur la page, car un diff qui décide silencieusement est un sur lequel vous ne pouvez pas agir.

Intervertir les côtés

Si vous avez collés les documents dans le mauvais ordre, Intervertir les côtés retourne la comparaison sans tout retaper, ce qui change aussi contre quelle côté une addition ou un retrait est signalé.

Retour aux articles