guide/json-diff.md

Comparer du JSON — tri des clés et normalisation

Comment éliminer les fausses différences dues à l'ordre des clés, à l'indentation ou à l'écriture des nombres quand on compare deux JSON, et ce qu'il faut savoir sur l'ordre des tableaux, les grands entiers et JSON Patch.

Dernière mise à jour: 2026-09-23

Comparer des données JSON — réponses d'API, fichiers de configuration, fichiers de traduction — est une tâche fréquente. Or, en comparant deux JSON tels quels comme du texte, on obtient souvent une foule de différences alors que les données sont identiques. Cet article en explique la raison et la solution.

D'où viennent les fausses différences

La norme JSON (RFC 8259) définit un objet comme « une collection non ordonnée de paires nom/valeur ». Autrement dit, {"a":1,"b":2} et {"b":2,"a":1} représentent les mêmes données. Mais en tant que texte, l'ordre des lignes diffère et diff y voit une différence. D'autres écarts sans rapport avec les données apparaissent aussi :

La solution : analyser puis réécrire sous la même forme

La méthode la plus fiable consiste à analyser les deux JSON pour en faire des données, puis à les resérialiser selon les mêmes règles.

  1. Analysez (parsez) les deux textes comme du JSON. S'il y a une erreur de syntaxe, corrigez-la d'abord.
  2. Triez récursivement les clés de tous les objets.
  3. Réécrivez le tout avec la même indentation (par exemple 2 espaces).
  4. Comparez le résultat ligne par ligne.

Par exemple, les deux JSON suivants ne diffèrent que par l'ordre des clés et par l'ordre d'un tableau.

{"name":"kim","age":30,"tags":["a","b"]}
{"age":30,"name":"kim","tags":["b","a"]}

Après tri et réécriture, la différence d'ordre des clés disparaît et seule reste la vraie différence, l'ordre du tableau.

@@ -2,7 +2,7 @@   "age": 30,   "name": "kim",   "tags": [-    "a",-    "b"+    "b",+    "a"   ] }

On ne trie pas les tableaux

Contrairement aux objets, l'ordre des éléments d'un tableau a un sens. ["a","b"] et ["b","a"] sont des données différentes. En règle générale, la normalisation ne trie donc pas les tableaux. Toutefois, pour un tableau dont l'ordre n'a pas d'importance métier, comme une liste de tags, le trier vous-même avant la comparaison rend le résultat plus lisible. Le bon choix dépend de la signification des données.

Ce que l'analyse modifie au passage

Réécrire après analyse a des effets secondaires à connaître.

En ligne de commande

Si jq est installé, l'option -S (--sort-keys) affiche le JSON avec ses clés triées.

jq -S . before.json > a.json
jq -S . after.json  > b.json
diff -u a.json b.json

La différence avec JSON Patch

Le résultat d'un diff est une liste de modifications par ligne, destinée à être lue par un humain. JSON Patch (RFC 6902), lui, est une norme qui exprime les modifications par chemins dans la structure JSON, comme {"op":"replace","path":"/age","value":31}, tandis que JSON Merge Patch (RFC 7396) consiste à appliquer sur l'original un JSON qui ne contient que les parties modifiées. Pour échanger des modifications entre programmes, ces normes conviennent ; pour une relecture humaine, le diff textuel après tri est plus adapté.

Essayer avec cet outil

Dans les options du comparateur de texte, activez Trier les clés JSON : les deux côtés sont analysés, leurs clés triées et le tout réécrit avec une indentation de 2 espaces avant la comparaison. L'ordre des tableaux n'est pas modifié, et en cas d'échec de l'analyse, l'outil indique de quel côté et à quel caractère se trouve l'erreur. Vous pouvez aussi déposer deux fichiers .json à la fois. Pour lire le résultat comme un patch, consultez Lire un diff unifié.

Ouvrir le comparateur de texte