Les pubs vous déplaisent ? Aller Sans pub Auj.

Comparaison d'objets JSON Comment détecter les différences dans les réponses API

Publié le
Comparaison d'objets JSON : Comment détecter les différences dans les réponses API 1
ANNONCE · Supprimer ?

Votre API de staging retourne un code 200. Votre API de production retourne un code 200. Mais quelque chose a cassé en aval, et vous regardez deux blocs de JSON en essayant de déterminer ce qui a changé.

La comparaison JSON semble triviale jusqu'à ce que vous soyez au milieu de ce processus.

Pourquoi la comparaison JSON est-elle plus difficile qu'elle n'en paraît

Le JSON n'a pas de forme canonique. Deux objets peuvent représenter des données identiques tout en apparaissant complètement différents sur le réseau. Voici ce qui embête les développeurs :

L'ordre des clés. Les objets JSON ne sont pas ordonnés selon la spécification — {"a":1,"b":2} et {"b":2,"a":1} sont semantiquement identiques. Mais si vous les comparez sous forme brute de chaîne, elles apparaissent différentes.

L'espace en blanc. Le JSON minifié contre le JSON formaté en version lisible échoue à une comparaison de chaînes. Même données, différents octets.

Une colonne remplie de nombres devrait devenir des nombres JSON. Une colonne avec des valeurs « vrai » / « faux » devrait devenir des valeurs booléennes. Mais une colonne de code postal qui semble un nombre (90210) devrait rester une chaîne — convertir cela détruit les zéros initiaux. "1" et 1 sont des valeurs JSON différentes. De même, null et une clé manquante. Votre outil de comparaison doit prendre en compte cette distinction — et vous aussi, car votre consommateur API pourrait ne pas les traiter de la même manière.

La profondeur des nœuds. Une valeur modifiée cachée à cinq niveaux de profondeur dans une grande réponse est facile à manquer lorsqu'on parcourt le résultat brut.

Égalité structurelle versus égalité sémantique

Cette distinction est importante lors de la détection de modifications d'API.

L'égalité structurelle signifie que le JSON est identique au niveau des octets après normalisation — mêmes clés, mêmes valeurs, même ordre. Utile pour la validation de cache ou la vérification de signature.

L'égalité sémantique signifie que les données représentent la même chose, même si la structure change. Une réponse qui renomme user_id à userId, ou ajoute un champ facultatif, est sémantiquement différente mais pourrait être fonctionnellement équivalente à votre consommateur.

Lors de la détection de retours, vous voulez généralement l'égalité structurelle. Lors de l'évaluation des modifications brisantes pour les consommateurs d'API, l'égalité sémantique est le cadre approprié.

Comment comparer du JSON dans le terminal

Avec jq et diff

jq trier les clés et normaliser l'espace en blanc, ce qui en fait une étape de prétraitement solide avant la comparaison :

diff <(jq --sort-keys . response_v1.json) <(jq --sort-keys . response_v2.json)

Cela gère l'ordre des clés et le formatage. Vous verrez uniquement les différences réelles de données. Ajoutez -c pour un affichage compact ou -u pour un format unifié.

Pour comparer une réponse d'API en temps réel avec une base de données sauvegardée :

diff <(jq --sort-keys . baseline.json) <(curl -s https://api.example.com/endpoint | jq --sort-keys .)

Avec Python’s deepdiff

Lorsque vous avez besoin d'une sortie structurée — en particulier pour les objets ou les tableaux imbriqués — deepdiff vous donne une vue programmable de ce qui a changé :

from deepdiff import DeepDiff
import json

with open("response_v1.json") as f:
    v1 = json.load(f)

with open("response_v2.json") as f:
    v2 = json.load(f)

diff = DeepDiff(v1, v2, ignore_order=True)
print(diff.to_json(indent=2))

DeepDiff catégorise les modifications : values_changed, dictionary_item_added, dictionary_item_removed, type_changes. Cela rend facile de mettre en place des vérifications de retour dans un environnement CI.

Installez-le avec : pip install deepdiff

Cas d'utilisation courants

Comparer les réponses d'API entre environnements. Le staging et la production doivent retourner la même structure. Un rapide diff jq après une déploiement peut détecter une dérive de schéma avant que les utilisateurs ne le constatent.

Détecter les dérives de schéma au fil du temps. Les APIs évoluent. En fixant une base de données sauvegardée et en exécutant un diff à chaque déploiement, vous pouvez suivre exactement quand et quoi a changé — au lieu de le découvrir à partir d'un rapport de bug.

Tests de retour. Enregistrez les réponses attendues, répétez les appels à l'API, comparez les sorties. Cela est particulièrement utile pour les APIs tierces où vous ne contrôlez pas le schéma.

Les pièges de la comparaison des tableaux

Les tableaux sont là où les outils de comparaison JSON deviennent confus. L'ordre compte dans les tableaux JSON selon la spécification, et la plupart des outils de comparaison traitent un tableau réordonné comme une série de valeurs modifiées plutôt que comme une réorganisation — produisant un résultat confus et bruyant.

Si votre API retourne une liste de tags et qu'ils reviennent dans un ordre différent, un diff naïf montre chaque élément comme modifié :

- "tags": ["json", "api", "rest"]
+ "tags": ["api", "json", "rest"]

Des outils comme deepdiff vous permettent de définir ignore_order=True pour les tableaux. jq n'ordonne pas les tableaux par défaut — vous devriez alors les passer par sort sur les champs de tableaux connus.

Règle pratique : si l'ordre des tableaux n'est pas significatif dans votre API (par exemple, une liste de tags), utilisez un outil de comparaison qui prend en charge une comparaison sans prise en compte de l'ordre. Si l'ordre compte (par exemple, une liste de résultats triée), ne le supprimez pas.

Quand utiliser la validation du schéma JSON au lieu de la comparaison

La comparaison est une comparaison à un instant donné — elle vous dit comment deux réponses spécifiques diffèrent. La validation du schéma JSON vous dit si une réponse respecte un contrat.

Utilisez la validation du schéma JSON lorsque :

  • Vous souhaitez enforcer la structure sur toutes les réponses, et non seulement comparer deux réponses spécifiques
  • Vous publiez une API publique et devez garantir la compatibilité vers l'arrière
  • Vous souhaitez détecter des champs manquants ou des types erronés, et non seulement des modifications de valeurs

Utilisez un outil de comparaison lorsque :

  • Vous avez deux réponses spécifiques et souhaitez comprendre ce qui a changé
  • Vous déboguez une régression entre versions d'API
  • Vous effectuez un contrôle rapide d'un déploiement

Ils résolvent des problèmes différents. Pour un test sérieux d'API, vous voulez les deux.

Une option plus rapide : utiliser IO Tools JSON Compare

Pour des comparaisons rapides dans un navigateur sans configuration, IO Tools JSON Compare gère les cas courants : l'ordre des clés, la normalisation de l'espace en blanc, les objets imbriqués et la comparaison type-aware. Collez deux objets JSON et obtenez une comparaison côte à côte propre.

C'est utile lorsque vous êtes en pleine débogage et que vous ne voulez pas ouvrir un terminal.

Référence rapide : ce que différentes approches détectent

Scénario Comparaison de chaînes jq + diff deepdiff Schéma JSON
Ordre des clés différent Manque Détecte Détecte Manque
Espaces en blanc supplémentaires Manque Détecte Détecte Manque
Mauvaise correspondance de type ("1" vs 1) Détecte Détecte Détecte Détecte
Valeur nulle vs clé manquante Détecte Détecte Détecte Détecte
Réorganisation d'un tableau Faux positif Faux positif Configurable Manque
Champ facultatif ajouté Détecte Détecte Détecte Configurable
Violation du contrat de schéma Manque Manque Manque Détecte

L'outil approprié dépend de ce que vous déboguez. Pour des vérifications rapides de santé, jq --sort-keys plus diff couvre la plupart des cas. Pour les tests de retour dans un environnement CI, deepdiff vous donne une sortie structurée et scriptable. Pour l'application de schémas, la validation JSON. Et quand vous avez besoin d'obtenir des réponses rapidement sans ouvrir un terminal, un outil de comparaison JSON dans un navigateur vous y conduit en quelques secondes.

Envie d'une expérience sans pub ? Passez à la version sans pub

Installez nos extensions

Ajoutez des outils IO à votre navigateur préféré pour un accès instantané et une recherche plus rapide

Sur Extension Chrome Sur Extension de bord Sur Extension Firefox Sur Extension de l'opéra

Le Tableau de Bord Est Arrivé !

Tableau de Bord est une façon amusante de suivre vos jeux, toutes les données sont stockées dans votre navigateur. D'autres fonctionnalités arrivent bientôt !

ANNONCE · Supprimer ?
ANNONCE · Supprimer ?
ANNONCE · Supprimer ?

Coin des nouvelles avec points forts techniques

Impliquez-vous

Aidez-nous à continuer à fournir des outils gratuits et précieux

Offre-moi un café
ANNONCE · Supprimer ?