Skip to content

JSON Diff (Comparateur)

Comparez deux fichiers JSON instantanément dans votre navigateur. Vue côte à côte, sortie JSON Patch RFC 6902, ignorer les champs bruyants comme les horodatages et les ID. 100% privé, aucun envoi.

Sans pistage Fonctionne dans le navigateur Gratuit
Ignorer les chemins :
Options avancées
Mode tableau
Reviewed for RFC 6902/6901 compliance and edge cases including null vs missing keys, type drift, floating-point precision, and array key alignment. — Go Tools API Tooling Team · 4 mai 2026

Qu'est-ce que JSON Diff ?

JSON Diff est une comparaison structurelle de deux documents JSON qui respecte le modèle de données JSON — les clés sont non ordonnées, les types sont stricts, et les tableaux peuvent être ordonnés ou indexés par clé. Contrairement à un diff texte (qui compare des lignes et signale les réordonnances de clés ou les espaces blancs comme des différences), un diff JSON produit des résultats sémantiquement pertinents.

La forme canonique lisible par machine est JSON Patch (RFC 6902), un tableau d'opérations ordonné (add, remove, replace, move, copy, test) qui transforme un document en un autre. Les chemins utilisent JSON Pointer (RFC 6901). Étroitement lié : JSON Merge Patch (RFC 7396) — plus simple mais ne peut pas distinguer « supprimer une clé » de « mettre une clé à null ». Cet outil génère du RFC 6902.

L'égalité profonde sur le JSON en JavaScript est plus difficile qu'il n'y paraît. JSON.stringify(a) === JSON.stringify(b) échoue sur les réordonnances de clés, et trompe sur -0 vs 0 (les deux se sérialisent en "0"). Un diff correct doit parcourir les deux arbres en parallèle en utilisant l'union des ensembles de clés, distinguer null du manquant via l'opérateur 'in', et décider ce que « égal » signifie pour les nombres (Object.is par défaut, epsilon pour la tolérance).

Cet outil s'exécute entièrement dans votre navigateur. Les entrées ne quittent jamais votre machine. Sûr pour les réponses API, les schémas internes et les configurations propriétaires.

Vous travaillez avec des outils JSON adjacents ? Formatez avec JSON Formatter ; convertissez avec JSON to YAML et YAML to JSON.

// Two JSON documents that look different but are semantically equal
const a = '{"a":1,"b":2}';
const b = '{"b":2,"a":1}';

// Naive comparison — wrong
JSON.stringify(JSON.parse(a)) === JSON.stringify(JSON.parse(b));
// → false (key order differs)

// JSON Diff (this tool) — correct: key order is irrelevant
// → 0 differences

// JSON Patch (RFC 6902) for { "a": 1 } → { "a": 2 }
// [{ "op": "replace", "path": "/a", "value": 2 }]

Fonctionnalités clés

Vue côte à côte + JSON Patch

Deux vues depuis un seul diff : mise en évidence visuelle pour la révision, patch RFC 6902 pour l'automatisation.

Ignorer les champs bruyants

Les préréglages en un clic suppriment /createdAt, /updatedAt, /*Id, /*At, requestId, traceId. Patterns JSON Pointer étendus personnalisés supportés.

Correspondance des tableaux par clé

Comparez des tableaux d'objets par un champ id plutôt que par index — pour les envs K8s, les entrées package-lock, ou toute liste logiquement non ordonnée.

Strict sur les types par défaut

1 ≠ "1". null ≠ manquant. Détectez la dérive de sérialisation backend dès qu'elle apparaît dans un test fixture.

100% basé sur le navigateur

Les entrées ne quittent jamais votre machine. Aucun envoi, aucun localStorage du JSON, aucune analyse de ce que vous collez.

Partage du lien, pas des données

Lien de partage n'écrit que votre configuration dans l'URL. Vos entrées JSON restent locales.

Exemples

API Response Regression

{"user":{"id":1,"name":"Ada","createdAt":"2024-01-01"}}
{"user":{"id":1,"name":"Ada Lovelace","createdAt":"2024-02-02"}}

Two changes (name + createdAt). Add /user/createdAt to Ignore paths and only the name change remains.

Config File Audit (Key Reorder)

{"a":1,"b":2,"c":3}
{"c":3,"a":1,"b":2}

Same data, different key order. JSON Diff treats key order as semantically irrelevant — diff is empty.

Array of Objects (Match by Key)

[{"id":1,"qty":3},{"id":2,"qty":5}]
[{"id":2,"qty":5},{"id":1,"qty":4}]

Switch Array mode to 'Match by key' with key=id. Without alignment every element looks changed; with alignment only qty on id=1 changes.

JSON Patch Output (RFC 6902)

{"items":[{"id":1,"price":29.99}]}
{"items":[{"id":1,"price":24.99}]}

Switch to the JSON Patch tab to get [{"op":"replace","path":"/items/0/price","value":24.99}] you can apply with fast-json-patch.

Comment utiliser

  1. 1

    Collez les deux documents JSON

    Collez le JSON original (gauche) et modifié (droite). Le diff live s'affiche pendant la saisie ; les grandes entrées (>200 Ko) basculent vers un bouton Diff manuel.

  2. 2

    Filtrez le bruit

    Cliquez sur un préréglage (Timestamps / IDs / Trace) ou collez des patterns JSON Pointer étendus dans « Ignorer les chemins » pour exclure les champs non pertinents.

  3. 3

    Choisissez la vue dont vous avez besoin

    Côte à côte pour la révision humaine, JSON Patch (RFC 6902) pour les opérations applicables par machine. Utilisez Lien de partage pour envoyer la configuration à un collègue.

Pièges courants du diff

Bruit d'ordre des clés (symptôme de diff texte)

Si votre outil de diff signale {"a":1,"b":2} vs {"b":2,"a":1} comme différents, il fait un diff de lignes, pas un diff JSON. Les clés JSON sont non ordonnées — cet outil ignore automatiquement l'ordre des clés.

✗ Incorrect
diff a.json b.json   # text diff: 'everything changed'
✓ Correct
JSON Diff (this tool): 0 differences

Confusion null vs manquant

{"a":null} et {} ne sont pas identiques. Les traiter comme égaux masque de vrais bugs backend.

✗ Incorrect
{"a": null} == {}   # collapsed by some tools
✓ Correct
{"a": null} ≠ {}     # type-strict diff

Ordre des tableaux sans alignement par clé

[{id:1},{id:2}] vs [{id:2},{id:1}] ne représente pas « deux changements » pour un ensemble logique. Le diff séquentiel le signale ainsi ; passez à Correspondance par clé.

✗ Incorrect
Sequential diff: 4 modified
✓ Correct
Match by key (id): 0 differences

Dérive de type (nombre vs chaîne)

Les backends sérialisent parfois les ID de manière inconsistante — 42 vs "42". L'outil les signale comme modifications de « type » pour que vous puissiez détecter la dérive tôt.

✗ Incorrect
{"id": 42} vs {"id": "42"}   # serialization bug
✓ Correct
Diff reports 'modified (type)' with both values

Précision des nombres flottants

0.1 + 0.2 !== 0.3 en IEEE 754. Avec tolerance=0 (défaut), cela est signalé. Définissez la tolérance à 1e-9 si vous souhaitez une équivalence numérique.

✗ Incorrect
tolerance=0:  0.30000000000000004 ≠ 0.3
✓ Correct
tolerance=1e-9: equal

Bruit d'horodatage et d'UUID

createdAt, updatedAt, requestId, traceId changent à chaque requête. Utilisez les préréglages de chemins ignorés pour les supprimer.

✗ Incorrect
Diff: 47 modifications (45 are timestamps)
✓ Correct
Add /createdAt, /updatedAt, /requestId to Ignore paths → 2 real changes

Cas d'usage courants

Régression de réponse API
Comparez les réponses staging et production ; ignorez les horodatages et les ID de requête pour ne faire ressortir que les changements de payload significatifs.
Échecs de tests snapshot CI
Collez le réel vs l'attendu d'un snapshot Jest/Vitest en échec. Filtrez le bruit et trouvez le vrai changement en quelques secondes.
Conflits package-lock / yarn.lock
Résolvez les conflits de fusion en alignant les dépendances sur le nom ; l'ordre des clés et les champs non liés cessent d'être du bruit.
Audit des valeurs K8s / Helm
Faites correspondre envs, volumeMounts et ports par nom. Détectez les réordonnances non intentionnelles vs les vraies modifications de config.
Couverture de traduction i18n
Comparez structurellement en.json avec zh.json pour trouver les clés de traduction manquantes ou supplémentaires sans bruit de valeur.
Révision du plan Terraform / CDK
Comparez la sortie du plan entre les exécutions ; la tolérance numérique gère l'arithmétique en virgule flottante, les chemins ignorés suppriment les ARN et les horodatages.

Détails techniques

Sortie de patch conforme RFC 6902
Génère des opérations JSON Patch valides (add/remove/replace) avec des chemins RFC 6901. Vérifié contre fast-json-patch@3.x et les packages npm rfc6902.
Traversée itérative
Traversée à pile explicite (sans récursion) limitée à 100 000 nœuds et une profondeur de 64 pour prévenir le débordement de pile sur des entrées adverses.
Égalité numérique Object.is
La tolérance numérique par défaut est 0 — utilise Object.is donc -0 et +0 sont distingués. Définissez la tolérance > 0 pour l'égalité basée sur epsilon.

Bonnes pratiques

Filtrez avant de réviser
Ajoutez d'abord les chemins à ignorer (horodatages, ID, champs de trace), puis lisez le diff. Réviser des diffs bruyants entraîne l'œil à sauter — et à manquer — les vrais changements.
Correspondance par clé pour les ensembles logiques
Si votre tableau représente un ensemble non ordonné (envs, utilisateurs, dépendances), utilisez Correspondance par clé. Le diff séquentiel sur les ensembles logiques est presque toujours incorrect.
Partagez le lien, pas les entrées
Utilisez Lien de partage pour envoyer à un collègue votre configuration de filtre — ne collez jamais de JSON sensible dans des documents partagés. L'URL ne contient que la configuration.

Foire aux questions

Pourquoi mon diff affiche-t-il tout comme modifié alors que je n'ai changé qu'un seul champ ?
Trois suspects habituels : (1) ordre des clés différent — JSON Diff traite l'ordre des clés comme équivalent, contrairement aux outils de diff texte ; (2) horodatages/UUID/auto-IDs qui changent à chaque requête — ajoutez-les aux chemins à ignorer ; (3) ordre des tableaux, lorsque la comparaison par index n'est pas appropriée — passez le mode tableau à « Correspondance par clé ».
Comment ignorer les horodatages et les ID dans un diff JSON ?
Utilisez le champ « Ignorer les chemins » ci-dessus. Cliquez sur le préréglage « Timestamps » ou « IDs » pour filtrer en un clic /createdAt, /updatedAt, /*Id, /*At, /requestId. Vous pouvez aussi coller vos propres patterns JSON Pointer étendus — un par ligne — pour un filtrage avancé.
Quelle est la différence entre JSON Patch et un diff visuel ?
Le diff visuel (côte à côte) est pour les humains — révision des modifications par l'œil. JSON Patch (RFC 6902) est pour les machines — un tableau d'opérations structuré (add/remove/replace) applicable avec les packages npm fast-json-patch ou rfc6902. Même diff, deux sorties.
JSON diff traite-t-il null et les clés manquantes de la même façon ?
Non. {"a":null} et {} diffèrent — le premier a un null explicite, le second n'a pas de clé. Les systèmes réels se comportent différemment pour les deux ; cet outil les maintient distincts.
Comment les tableaux sont-ils comparés — par index ou par clé ?
Par index (séquentiel) par défaut. Passez à « Correspondance par clé » et fournissez un champ de clé (généralement id) pour aligner les éléments indépendamment de l'ordre. Utilisez cela pour les envs K8s, les entrées package-lock, ou toute liste logiquement non ordonnée.
Puis-je exporter le diff en tant que RFC 6902 JSON Patch ?
Oui. L'onglet JSON Patch génère un tableau d'opérations RFC 6902 valide. Si des chemins sont ignorés, le patch est filtré (l'onglet affiche « (filtré : exclut N chemins ignorés) ») et ne reconvertira pas exactement les originaux. Videz les chemins ignorés pour un patch complet.
JSON Patch est-il identique à JSON Merge Patch (RFC 7396) ?
Non. RFC 6902 (JSON Patch) est un tableau d'opérations ordonné — explicite et réversible. RFC 7396 (Merge Patch) est un document de fusion unique — plus simple mais ne peut pas représenter différemment la suppression et la mise à null. JSON Diff génère du RFC 6902.
Comment comparer deux gros fichiers JSON (>10 Mo) ?
Les fichiers de plus de ~5 Mo dépassent la mémoire pratique du navigateur. Le mode live se désactive à 200 Ko ; pour les fichiers de plusieurs mégaoctets, utilisez jq en ligne de commande ou fast-json-patch dans Node.
L'outil envoie-t-il mon JSON à un serveur ?
Non. Toute comparaison s'exécute localement dans votre navigateur. Les entrées ne sont jamais écrites sur disque, réseau, localStorage ou paramètres URL. Actualiser la page les efface. Le bouton Lien de partage n'écrit que votre configuration (mode tableau, chemins ignorés) — jamais vos données.
Pourquoi 42 diffère-t-il de "42" dans le diff ?
JSON Diff est strict sur les types : le nombre 42 et la chaîne "42" ne sont pas égaux. Cela détecte les dérives de sérialisation backend (certains points de terminaison retournent des ID numériques, d'autres des chaînes) — le diff l'étiquette comme modification de « type ».
Puis-je comparer du JSON avec des commentaires (JSONC) ou des virgules finales ?
Le JSON standard (RFC 8259) n'autorise pas les commentaires ni les virgules finales. Cet outil utilise le natif JSON.parse, qui rejette les deux. Supprimez d'abord les commentaires avec JSON Formatter.
Comment comparer des tableaux imbriqués d'objets par une clé comme id ?
Définissez le mode tableau sur « Correspondance par clé » et entrez id. Le diff s'aligne sur les valeurs d'id. v1 applique le même champ de clé à chaque profondeur de tableau ; les tableaux internes sans ce champ reviennent au séquentiel et émettent un avertissement.
Le diff gère-t-il la précision des nombres flottants (0.1 + 0.2) ?
Oui, avec la tolérance numérique. La valeur par défaut est 0 avec Object.is — donc -0 vs +0 sont signalés. Définissez la tolérance sur un petit epsilon (ex. 1e-9) et 0.1 + 0.2 sera considéré égal à 0.3. La tolérance s'applique uniquement aux valeurs numériques feuilles.