Skip to content

Testeur JSONPath gratuit — Évaluez en ligne

Testez vos expressions JSONPath sur tout JSON à l'instant. Moteur standard RFC 9535 et mode Classique Goessner, vues Valeurs / Chemins / Les deux, chemins normalisés, sans eval. 100 % privé, dans le navigateur, sans envoi.

Sans pistage Fonctionne dans le navigateur Gratuit
Toute l'évaluation s'exécute localement dans votre navigateur. Votre JSON et votre expression ne quittent jamais cet appareil. Sans eval, sans téléversement.
Moteur
 
Aide-mémoire JSONPath
$Élément racine
@Élément courant (dans les filtres)
.nameMembre enfant
..nameDescente récursive
[*]Tous les éléments / membres
[0]Indice de tableau
[0:2]Tranche de tableau [start:end:step]
[a,b]Union de noms / indices
[?(@.k>1)]Expression de filtre
length()Fonction RFC 9535 : length / count / match / search / value
Vérifié pour la fidélité à la grammaire RFC 9535, l'exactitude des chemins normalisés, la parité sémantique double moteur sur les chemins courants et la divergence documentée dans les cas limites, la sécurité sans eval (fermeture de CVE-2024-21534 et CVE-2025-1302), et l'accessibilité (rôles ARIA, commutateur de moteur en radiogroup, annonces de résultats aux lecteurs d'écran, gestion LTR du JSON sous une mise en page RTL). — Équipe Outillage de données Go Tools · 13 juin 2026

Qu'est-ce qu'un testeur JSONPath ?

Un testeur JSONPath est un outil qui vous permet d'écrire une expression JSONPath, de coller un document JSON et de voir exactement quels nœuds l'expression sélectionne — à la fois les valeurs correspondantes et leurs emplacements précis — sans écrire de code ni exécuter de script. Pour les développeurs, il raccourcit la boucle de quelques minutes à quelques millisecondes : ajustez le chemin, observez le résultat changer, et livrez la requête en toute confiance.

JSONPath est un langage de requête pour JSON, l'équivalent JSON de XPath pour XML. Une expression se construit à partir d'un petit alphabet de sélecteurs. $ est la racine du document. Un point ou un crochet entre dans un enfant : $.store ou $['store']. Le double point .. est la descente récursive — il parcourt chaque niveau de l'arbre. Le joker * sélectionne tous les éléments ou membres. Les crochets portent les indices de tableau ([0]), les tranches ([start:end:step]), les unions ([a,b]) et les expressions de filtre ([?(@.price < 10)], où @ est l'élément testé). Avec ces pièces, vous pouvez extraire un seul champ d'une réponse d'API profondément imbriquée, valider des valeurs dans les tests, piloter des transformations de données dans des systèmes comme Kubernetes, AWS Step Functions et Azure Logic Apps, ou extraire des données structurées d'un JSON irrégulier — le tout sans code de parcours impératif. JSONPath est aussi tristement célèbre pour son incohérence entre les implémentations, ce qui est précisément le problème qu'un bon testeur met en évidence avant qu'il n'atteigne la production.

Ce testeur embarque deux moteurs. Le moteur par défaut est un moteur RFC 9535 : RFC 9535 est la spécification formelle de JSONPath publiée par l'IETF en février 2024, la première fois que le langage a été précisément normalisé après quinze ans d'implémentations divergentes. Elle définit une grammaire exacte, le concept de chemins normalisés pour les résultats, et cinq fonctions standard — length(), count(), match(), search(), value(). Notre moteur RFC 9535 est une implémentation sans dépendance qui n'utilise aucun eval, il analyse donc et interprète les expressions avec sa propre grammaire au lieu de les compiler en JavaScript. Le second moteur est Classique (Goessner), le dialecte de fait de 2007 que la plupart des anciens outils et bibliothèques en ligne implémentent ; basculez-y pour reproduire les résultats d'un outil comme jsonpath.com ou pour exécuter une expression copiée depuis du code hérité. Les deux dialectes s'accordent sur les chemins courants mais divergent dans les cas limites — espaces et guillemets des filtres, ordre des unions, comparaison des membres manquants, et fonctions disponibles — donc pouvoir basculer entre eux au même endroit est le moyen le plus rapide de diagnostiquer pourquoi une expression se comporte autrement que prévu.

Ce que le testeur met en évidence au-delà des valeurs brutes : le résultat d'une requête JSONPath est une liste de nœuds, et cet outil peut l'afficher de trois façons. La vue Valeurs rend les nœuds correspondants sous forme de tableau JSON, exactement ce que vous consommeriez dans le code. La vue Chemins rend le chemin normalisé de chaque correspondance — un emplacement canonique entre crochets et guillemets tel que $['store']['book'][0]['title'] qui identifie de façon unique où se trouve la valeur dans le document, peu importe la façon dont l'expression a été écrite. Deux expressions qui sélectionnent le même nœud produisent le même chemin normalisé, ce qui rend la vue Chemins précieuse pour le débogage. La vue Les deux affiche valeurs et chemins côte à côte. Une ligne de statistiques indique combien de nœuds ont correspondu.

La sécurité est ici une préoccupation de premier ordre. De nombreux évaluateurs JSONPath en ligne s'exécutent sur un serveur, ou intègrent une bibliothèque qui évalue les prédicats de filtre avec eval de JavaScript — la conception qui a produit les vulnérabilités d'exécution de code à distance suivies sous CVE-2024-21534 et CVE-2025-1302 dans des paquets JSONPath largement utilisés. Cet outil n'utilise aucun eval. Le moteur RFC 9535 n'a aucun chemin eval, et le moteur Classique est construit sur une version corrigée et épinglée de jsonpath-plus avec eval explicitement désactivé. Cela ferme la classe de bugs d'exécution de code à distance et permet à l'outil de fonctionner sous une Content-Security-Policy stricte qui interdit unsafe-eval. Chaque évaluation est locale : votre JSON et votre expression ne quittent jamais la page, ne sont jamais journalisés et ne sont jamais stockés sur disque — seules vos préférences de moteur et de vue persistent dans localStorage. Cela rend l'outil sûr pour les charges utiles d'API propriétaires, les journaux caviardés, la configuration interne, et toute donnée dont le schéma vous empêcherait de la coller dans un service côté serveur.

Si votre tâche consiste à manipuler du JSON, associez ceci aux autres outils JSON du site : formatez et mettez en forme votre entrée avec le Formateur JSON, comparez deux documents avec le JSON Diff, vérifiez une charge utile par rapport à un schéma avec le Validateur de schéma JSON, ou transformez un exemple de réponse en interfaces typées avec JSON to TypeScript.

// The expression you build in this tester maps straight onto the
// RFC 9535 reference library used under the hood.
import { query, paths } from 'jsonpath-rfc9535';

const document = {
  store: {
    book: [
      { title: 'Sayings of the Century', author: 'Nigel Rees', price: 8.95 },
      { title: 'Sword of Honour', author: 'Evelyn Waugh', price: 12.99 },
      { title: 'Moby Dick', author: 'Herman Melville', price: 8.99 },
      { title: 'The Lord of the Rings', author: 'J. R. R. Tolkien', price: 22.99 }
    ]
  }
};

// Values: query(document, path) returns the matched values directly.
const titles = query(document, '$.store.book[*].title');
// → ['Sayings of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']

// Filter: books cheaper than 10.
const cheap = query(document, '$.store.book[?(@.price < 10)].title');
// → ['Sayings of the Century', 'Moby Dick']

// Normalized paths: paths(document, path) returns where each match lives.
const authorPaths = paths(document, '$..author');
// → ["$['store']['book'][0]['author']", "$['store']['book'][1]['author']", ...]

// RFC 9535 functions like length() are used INSIDE filters, not as a segment.
const longTitles = query(document, '$.store.book[?length(@.title) > 15]');
// → the two books whose title is longer than 15 characters

Fonctionnalités clés

Moteur standard RFC 9535 (sans eval)

Le moteur par défaut implémente RFC 9535, la spécification formelle de JSONPath de l'IETF de 2024 — grammaire exacte, chemins normalisés et les cinq fonctions standard. Il est sans dépendance et n'utilise aucun eval, il analyse donc et interprète les expressions avec sa propre grammaire au lieu de les compiler en JavaScript. Il fonctionne sous une Content-Security-Policy stricte.

Mode de compatibilité Classique (Goessner)

Un seul commutateur bascule vers un moteur compatible Goessner (construit sur jsonpath-plus, configuré avec eval désactivé) pour que les expressions copiées d'anciens outils comme jsonpath.com se comportent comme vous les y avez vues. Basculez entre RFC 9535 et Classique pour comparer les résultats et diagnostiquer pourquoi un chemin correspond différemment selon les dialectes.

Trois vues de résultats : Valeurs, Chemins, Les deux

Valeurs rend les nœuds correspondants sous forme de tableau JSON, exactement ce que vous consommez dans le code. Chemins rend le chemin normalisé de chaque correspondance tel que $['store']['book'][0]['title']. Les deux les affiche côte à côte pour que vous reliiez chaque valeur à son emplacement précis. La vue active persiste entre les sessions.

Chemins normalisés pour chaque correspondance

Chaque résultat porte son chemin normalisé canonique entre crochets et guillemets — la façon RFC 9535 d'identifier de manière unique l'emplacement d'un nœud, quelle que soit la manière dont l'expression a été écrite. Deux expressions qui atteignent le même nœud produisent le même chemin normalisé, ce qui simplifie le débogage des requêtes ambiguës.

Prise en charge complète des sélecteurs

Racine $, élément courant @, enfant .name, descente récursive ..name, joker [*], indice de tableau [0], tranche [start:end:step], union [a,b], et expressions de filtre [?()] avec opérateurs de comparaison et logiques. Un aide-mémoire intégré documente chaque sélecteur pour que vous n'ayez jamais à quitter la page pour en consulter un.

Extensions de fonction RFC 9535

Appelez length(), count(), match(), search() et value() dans les expressions — comptez les éléments d'un tableau, testez une chaîne par rapport à un motif I-Regexp, ou filtrez sur la taille d'une liste imbriquée. Ces fonctions standard sont disponibles dans le moteur par défaut ; l'outil vous indique de changer de moteur si vous les invoquez en mode Classique.

Formater, Téléverser et Exemples

Formater le JSON met en forme votre entrée pour que la structure soit lisible avant la requête. Téléverser lit un fichier .json ou .txt entièrement dans le navigateur — il n'est jamais envoyé nulle part. Le menu Exemples charge des expressions de départ fiables sur des données d'exemple pour que vous voyiez le moteur à l'œuvre avant d'adapter un chemin.

Partage par lien permanent (sans téléversement)

Copier le lien encode le JSON, l'expression, le moteur et la vue dans le fragment de l'URL. Les navigateurs ne transmettent jamais les fragments d'URL dans les requêtes, donc un lien partagé reproduit tout votre état sur la machine du destinataire sans toucher aux serveurs de go-tools.org. Autonome et auditable pour le débogage collaboratif.

100 % privé, uniquement dans le navigateur

Votre JSON et votre expression ne quittent jamais votre appareil. Aucune requête réseau, aucune journalisation, aucune analyse de ce que vous tapez — vérifiez dans les DevTools → Réseau. Seules les préférences de moteur et de vue persistent dans localStorage. Sûr pour les charges utiles propriétaires, les journaux caviardés et toute donnée que vous ne colleriez pas dans jsonpath.com.

Exemples concrets

Sélectionner chaque titre de livre d'un document de librairie

$.store.book[*].title
["Sayings of the Century", "Sword of Honour", "Moby Dick", "The Lord of the Rings"]

Collez le classique JSON de librairie de Goessner, saisissez l'expression, et la vue Valeurs renvoie un tableau JSON des quatre titres. Passez à Chemins pour voir chaque résultat sous forme de chemin normalisé tel que $['store']['book'][0]['title']. Le joker [*] parcourt chaque élément du tableau book ; .title projette un membre de chacun.

Filtrer les livres à moins de 10 avec une expression de filtre

$.store.book[?(@.price < 10)].title
["Sayings of the Century", "Moby Dick"]

Le sélecteur de filtre [?()] ne conserve que les éléments du tableau pour lesquels le prédicat est vrai ; @ est l'élément courant. Sur les données de librairie (prix 8.95, 12.99, 8.99, 22.99), deux livres correspondent. Les deux moteurs acceptent cette forme, mais notez que le mode Classique (Goessner) écrit le même filtre sous la forme [?(@.price<10)] — changez de moteur si vous avez copié une expression d'un ancien outil.

Parcourir tout l'arbre avec la descente récursive

$..author
["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"]

L'opérateur .. descend dans chaque niveau du document et collecte chaque membre author où qu'il apparaisse, quelle que soit la profondeur d'imbrication. La descente récursive est le moyen le plus rapide d'extraire un champ d'une structure profondément imbriquée ou irrégulière sans avoir à écrire le chemin complet.

Découper un tableau avec [start:end:step]

$.store.book[0:2].title
["Sayings of the Century", "Sword of Honour"]

Les tranches de tableau suivent la même convention semi-ouverte [start:end] que Python et JavaScript : de l'indice 0 jusqu'à l'indice 2 exclu, ce qui renvoie les deux premiers livres. Ajoutez un troisième champ pour un pas — $.store.book[::2] prend un élément sur deux. La borne de fin est exclusive, un piège d'erreur d'écart d'un que la vue Chemins rend évident.

Filtrer par longueur de titre avec la fonction length() de RFC 9535

$.store.book[?length(@.title) > 15]
[{"title": "Sayings of the Century", "author": "Nigel Rees", "price": 8.95}, {"title": "The Lord of the Rings", "author": "J. R. R. Tolkien", "price": 22.99}]

length() est l'une des cinq fonctions standard de RFC 9535, et elle n'est valide qu'à l'intérieur d'une expression de filtre [?...] — jamais comme segment de chemin autonome tel que $.store.book.length(), que la grammaire RFC 9535 rejette (cette forme de segment est une extension jsonpath-plus, pas du JSONPath standard). Ici, le filtre conserve chaque livre dont le titre compte plus de 15 caractères ; sur les données de librairie, les titres de plus de 15 caractères sont sélectionnés (par exemple « Sayings of the Century » et « The Lord of the Rings »), tandis que les plus courts comme « Moby Dick » et « Sword of Honour » sont exclus. count(), match(), search() et value() s'utilisent de même à l'intérieur des filtres. Ces fonctions sont une caractéristique de RFC 9535 — passez au moteur standard (le moteur par défaut) pour les utiliser ; le mode Classique (Goessner) ne les implémente pas.

Sélectionner une union de deux membres nommés

$.store.book[0]['title','author']
["Sayings of the Century", "Nigel Rees"]

Un sélecteur d'union [a,b] rassemble plusieurs enfants en une seule expression. Ici, il extrait à la fois le titre et l'auteur du premier livre. Les unions fonctionnent aussi avec des indices de tableau — [0,2] récupère le premier et le troisième élément. La vue Les deux associe chaque valeur à son chemin normalisé pour que vous voyiez exactement quel membre a produit quel résultat.

Comment utiliser le testeur JSONPath

  1. 1

    Collez ou téléversez votre JSON

    Déposez le JSON dans le champ de saisie, collez-le, ou cliquez sur Téléverser pour charger un fichier .json / .txt depuis le disque. Formater le JSON réindente le document. Un JSON invalide est signalé en ligne avec un message de l'analyseur avant la requête.

  2. 2

    Choisissez un moteur

    RFC 9535 (le standard IETF de 2024, sans eval) est le moteur par défaut. Passez à Classique (Goessner) lorsque vous exécutez une expression copiée d'un ancien outil tel que jsonpath.com pour que les résultats correspondent à ce que vous y avez vu.

  3. 3

    Saisissez votre expression JSONPath

    Le $ initial est affiché pour vous. Commencez par un chemin enfant comme .store.book[*].title, un indice comme [0], une descente récursive comme ..author, ou un filtre comme [?(@.price < 10)]. Les résultats se mettent à jour en direct au fur et à mesure de la saisie.

  4. 4

    Changez la vue des résultats

    Valeurs affiche un tableau JSON des valeurs correspondantes. Chemins affiche le chemin normalisé de chaque correspondance tel que $['store']['book'][0]['title']. Les deux les affiche côte à côte pour que vous reliiez chaque valeur à son emplacement exact dans le document.

  5. 5

    Copiez le résultat ou partagez un lien permanent

    Copier le résultat place la sortie dans votre presse-papiers. Copier le lien encode le JSON, l'expression, le moteur et la vue dans un fragment d'URL (sans téléversement) pour qu'un collègue reproduise la requête exacte localement sur sa propre machine.

Erreurs JSONPath courantes

Oubli de la racine $ en tête

Chaque expression JSONPath commence à la racine, notée $. L'omettre (ou écrire le chemin comme si $ était implicite) fait rejeter l'expression par la plupart des moteurs. Le testeur affiche le $ pour vous, commencez donc votre saisie par le sélecteur suivant — un point, un crochet ou une descente récursive.

✗ Incorrect
store.book[*].title  →  invalid (no root)
✓ Correct
$.store.book[*].title  →  selects every title

Erreur d'écart d'un dans une tranche — l'indice de fin attendu inclus

Les tranches sont semi-ouvertes : [start:end] va jusqu'à end exclu. [0:2] renvoie deux éléments (indices 0 et 1), pas trois. Pour inclure le dernier élément par indice, utilisez [start:] ou poussez la borne de fin un cran au-delà.

✗ Incorrect
$.store.book[0:2]  →  first TWO books, not three
✓ Correct
$.store.book[0:3]  →  first three books (indices 0,1,2)

Expression Classique utilisée dans le moteur RFC 9535 (ou l'inverse)

Une expression copiée de jsonpath.com ou jsonpath-plus peut s'analyser ou correspondre différemment sous RFC 9535 en raison des différences de filtre, d'union et de fonction. Si les résultats semblent erronés, basculez le commutateur de moteur pour correspondre au dialecte pour lequel l'expression a été écrite.

✗ Incorrect
Classic filter run under RFC 9535  →  parse error or unexpected nodes
✓ Correct
Switch engine to Classic (Goessner)  →  reproduces the original result

Appel d'une fonction RFC 9535 comme segment autonome

length(), count(), match(), search() et value() sont des extensions de fonction RFC 9535 valides uniquement à l'intérieur d'un filtre [?...]. Un appel de segment autonome comme $.store.book.length() est rejeté par la grammaire RFC 9535 (c'est une extension jsonpath-plus, pas du standard). Appelez la fonction à l'intérieur d'un filtre, et utilisez le moteur RFC 9535 par défaut — le moteur Classique (Goessner) n'implémente pas ces fonctions.

✗ Incorrect
$.store.book.length()  →  parse error (not a valid RFC 9535 segment)
✓ Correct
$.store.book[?length(@.title) > 15]  →  books with a title over 15 chars

Oubli de @ dans une expression de filtre

À l'intérieur d'un filtre [?()], l'élément courant est @, pas $. Écrire $.price renvoie à la racine du document plutôt qu'à l'élément testé, donc le filtre ne sélectionne rien ou tout. Utilisez @ pour adresser les membres de l'élément filtré.

✗ Incorrect
$.store.book[?($.price < 10)]  →  wrong scope
✓ Correct
$.store.book[?(@.price < 10)]  →  books under 10

Nom de membre entre guillemets avec la mauvaise syntaxe

La notation entre crochets exige des guillemets autour des clés de chaîne : $['store'] ou $.store fonctionnent tous deux, mais $[store] (sans guillemets entre crochets) est une erreur d'indice/identifiant. Utilisez des guillemets entre crochets pour toute clé comportant des espaces, des points ou des caractères spéciaux : $['first name'].

✗ Incorrect
$[store][book]  →  invalid bracket selectors
✓ Correct
$['store']['book']  →  same as $.store.book

S'attendre à ce que la descente récursive s'arrête au premier niveau

$..author ne s'arrête pas au sommet — il collecte chaque membre author à chaque profondeur. Si vous ne voulez que les enfants directs, écrivez le chemin complet. La descente récursive sur un document volumineux peut renvoyer bien plus de nœuds que prévu.

✗ Incorrect
$..price  →  every price anywhere in the tree
✓ Correct
$.store.book[*].price  →  only book prices

Qui utilise cet outil

Extraire des champs d'une réponse d'API
Extrayez des identifiants de requête, des attributs de ressource imbriqués ou une liste de noms d'une charge utile JSON sans écrire de code de parcours. Construisez le chemin ici sur un exemple de réponse, confirmez qu'il renvoie exactement les nœuds voulus dans la vue Valeurs, puis collez l'expression validée dans votre application ou votre test.
Écrire des assertions pour les tests d'intégration
De nombreux frameworks de test et outils de tests contractuels (REST Assured, Karate, Postman) utilisent JSONPath pour valider les corps de réponse. Rédigez le chemin d'assertion ici, vérifiez qu'il sélectionne le bon nœud sur une réponse réelle, et copiez-le dans votre test — en détectant un mauvais chemin avant que la suite ne passe au rouge.
Configurer des transformations de données dans les pipelines
Kubernetes, AWS Step Functions, Azure Logic Apps et de nombreux outils ETL acceptent JSONPath pour adresser des champs dans les charges utiles d'événements. Prototypez le chemin exact ici sur un événement représentatif, confirmez qu'il se résout, et déposez-le dans la configuration de votre pipeline avec la certitude qu'il pointe là où vous le souhaitez.
Reproduire un résultat de jsonpath.com en privé
Vous avez une expression issue d'un évaluateur côté serveur mais vous ne pouvez pas coller vos données sur un site tiers ? Passez en mode Classique (Goessner), chargez votre JSON, et reproduisez le même résultat localement — aucune charge utile ne quitte jamais votre navigateur, donc les données propriétaires restent sur votre machine.
Migrer des expressions héritées vers RFC 9535
Vous migrez vers un système annonçant la conformité à RFC 9535 ? Exécutez une expression héritée en mode Classique, puis basculez sur le moteur RFC 9535 pour voir si elle s'analyse encore et correspond aux mêmes nœuds. La comparaison double moteur cible les différences de filtre, d'union et de fonction que vous rencontreriez sinon en production.
Déboguer pourquoi un chemin renvoie les mauvais nœuds
Un chemin qui sélectionne trop ou trop peu est difficile à raisonner à partir des seules valeurs. Passez à la vue Chemins pour voir l'emplacement normalisé de chaque correspondance — l'indice de tableau exact, la chaîne de membres exacte — et l'erreur d'écart d'un dans une tranche ou la descente récursive parasite devient immédiatement évidente.
Enseigner ou réviser JSONPath
Ouvrez une expression fonctionnelle sur des données d'exemple et parcourez-la sélecteur par sélecteur, en basculant entre Valeurs et Chemins pour que l'apprenant voie à la fois ce qui est sélectionné et où cela se trouve. L'aide-mémoire et les exemples concrets fournissent une référence structurée pour la revue de code ou l'intégration.

Notes sur le moteur et l'algorithme

Moteur RFC 9535 (jsonpath-rfc9535, sans dépendance)
Le moteur par défaut implémente directement la grammaire IETF RFC 9535 : il tokenise et analyse l'expression en un arbre syntaxique abstrait et l'interprète sur le document. Il n'y a ni eval ni constructeur Function nulle part dans le chemin, il est donc immunisé contre la classe de bugs d'injection eval et fonctionne sous une Content-Security-Policy stricte.
Moteur Classique (jsonpath-plus, eval désactivé)
Le moteur Classique (Goessner) est jsonpath-plus, épinglé à une version corrigée (>= 10.4.0) et configuré avec l'option eval explicitement à false. Cela conserve la compatibilité avec le dialecte Goessner tout en fermant les vecteurs d'exécution de code à distance suivis sous CVE-2024-21534 et CVE-2025-1302, qui affectaient le chemin de filtre eval par défaut de la bibliothèque.
Génération de chemins normalisés
Chaque correspondance est rapportée avec son chemin normalisé RFC 9535 — une forme canonique utilisant la notation entre crochets et guillemets simples ($['store']['book'][0]['title']) avec les indices de tableau en entiers nus. Les chemins normalisés sont stables et uniques par nœud, donc des expressions équivalentes produisent des chemins identiques, ce sur quoi reposent les vues Chemins et Les deux pour une identification non ambiguë des résultats.
Fragments de moteur chargés à la demande
Les deux moteurs sont chargés sous forme de fragments JavaScript distincts uniquement à la première sélection, de sorte que la page initiale reste légère et que le moteur que vous n'utilisez pas n'est jamais téléchargé. Changer de moteur réévalue immédiatement l'expression courante sur le document courant, sans rechargement de page.
Lecture de fichier locale et formatage JSON
Le bouton Téléverser utilise l'API FileReader du navigateur pour lire un fichier .json ou .txt dans la saisie entièrement côté client — le fichier n'est jamais transmis. Formater le JSON analyse et resérialise l'entrée avec une indentation de deux espaces, en faisant remonter les erreurs d'analyse en ligne pour qu'un JSON malformé soit détecté avant l'évaluation.
Liens permanents via fragment d'URL (jamais transmis)
L'état de partage est encodé dans le fragment location.hash, transportant le JSON, l'expression, le moteur actif et la vue des résultats. Les navigateurs n'incluent jamais le fragment dans les requêtes HTTP, donc les serveurs de go-tools.org ne reçoivent aucune donnée à l'ouverture d'un lien permanent ; le rechargement se fait entièrement sur l'appareil du destinataire.

Bonnes pratiques JSONPath

Choisissez le moteur qui correspond à votre cible
Si votre système en aval annonce la conformité à RFC 9535, écrivez et validez avec le moteur RFC 9535. Si vous reproduisez ou maintenez une expression d'un ancien outil ou d'une ancienne bibliothèque, utilisez Classique (Goessner). Valider avec le mauvais dialecte est la raison la plus fréquente pour laquelle un chemin qui fonctionnait dans le testeur échoue en production.
Vérifiez avec la vue Chemins, pas seulement les Valeurs
La vue Valeurs vous dit ce qui a correspondu ; la vue Chemins vous dit où. Quand une requête renvoie des valeurs qui semblent correctes, elle peut tout de même les sélectionner depuis le mauvais emplacement — une descente récursive parasite ou un joker trop large. Vérifiez les chemins normalisés pour confirmer que l'expression atteint exactement les nœuds voulus.
Attention à la fin exclusive d'une tranche
[0:2] sélectionne les indices 0 et 1, pas 0 à 2 — la borne de fin est exclusive, tout comme en Python et JavaScript. Les erreurs d'écart d'un sur les tranches sont le bug JSONPath le plus fréquent. Utilisez la vue Chemins pour lire l'indice exact de chaque élément sélectionné et confirmer la limite avant de livrer.
Préférez un chemin explicite à la descente récursive quand vous le pouvez
$..price est pratique mais correspond à chaque prix où qu'il soit dans le document, y compris ceux que vous ne visiez pas. Quand vous connaissez la structure, écrivez le chemin complet ($.store.book[*].price) pour que la requête reste précise et prévisible à mesure que les données grandissent. Réservez .. aux formes réellement irrégulières ou inconnues.
Gardez espaces et guillemets cohérents dans les filtres
RFC 9535 suit sa grammaire à la lettre pour les expressions de filtre, tandis que le dialecte classique est plus souple. Écrivez les filtres proprement — entourez les littéraux de chaîne de guillemets simples ('fiction'), espacez les opérateurs, et évitez de compter sur une analyse permissive — pour que la même expression s'évalue de la même façon quel que soit le moteur ou la bibliothèque qui finira par l'exécuter.

Foire aux questions

Mon JSON ou mon expression JSONPath sont-ils envoyés à votre serveur ?
Non. Chaque évaluation s'exécute en JavaScript dans votre navigateur. Votre document JSON et votre expression JSONPath ne sont ni téléversés, ni journalisés, ni stockés sur disque, ni envoyés à un tiers. Seules vos préférences d'interface — le moteur actif (RFC 9535 ou Classique) et la vue des résultats (Valeurs / Chemins / Les deux) — sont enregistrées dans localStorage pour que la page s'en souvienne à la prochaine visite ; le JSON et l'expression eux-mêmes ne sont jamais conservés. Vous pouvez le vérifier en ouvrant les DevTools → Réseau : taper dans l'un ou l'autre champ déclenche zéro requête. Cela rend cet outil sûr pour les charges utiles d'API propriétaires, les échantillons de journaux caviardés, la configuration interne, et tout ce que vous ne colleriez pas dans un évaluateur côté serveur comme jsonpath.com.
Qu'est-ce que JSONPath et à quoi sert-il ?
JSONPath est un langage de requête pour JSON, de la même façon que XPath est un langage de requête pour XML. Vous écrivez une expression de chemin — par exemple $.store.book[*].author — et l'évaluateur renvoie chaque valeur du document que le chemin sélectionne. Il sert à extraire des champs précis des réponses d'API, à valider des valeurs dans les tests d'intégration, à configurer des transformations de données dans des outils comme Jenkins, Kubernetes, AWS Step Functions et Azure Logic Apps, et à extraire des données d'un JSON volumineux ou irrégulier sans écrire de code de parcours impératif. Une expression se construit à partir d'un axe de sélecteurs : $ (la racine), . ou [] (accès enfant), .. (descente récursive), * (joker), [start:end:step] (tranche de tableau), [a,b] (union) et [?()] (filtre). Ce testeur évalue l'expression en direct et affiche à la fois les valeurs correspondantes et leurs chemins normalisés.
Quelle est la différence entre RFC 9535 et la syntaxe classique de Goessner ?
Le JSONPath classique est la syntaxe de fait que Stefan Goessner a publiée en 2007. Elle a été largement implémentée mais jamais formellement normalisée, si bien que des comportements subtils — la façon d'écrire les filtres, le fonctionnement des unions et de la fonction racine, la comparaison des valeurs absentes — ont divergé d'une bibliothèque à l'autre. RFC 9535, publiée par l'IETF en février 2024, est la première spécification formelle de JSONPath. Elle fixe une grammaire précise, définit les chemins normalisés pour les résultats et ajoute des fonctions standard (length, count, match, search, value). Les deux sont proches mais pas identiques : RFC 9535 est plus stricte sur les espaces et les guillemets dans les filtres, définit la sémantique de comparaison pour les membres manquants, et rejette certaines constructions permissives que le dialecte classique tolérait. Cet outil utilise par défaut le moteur RFC 9535 (une implémentation sans dépendance ni eval) et permet de basculer vers un moteur Classique (Goessner) pour la rétrocompatibilité.
Pourquoi la même expression renvoie-t-elle des résultats différents dans les deux moteurs, et comment utiliser une expression copiée depuis jsonpath.com ?
Parce que RFC 9535 et le dialecte classique de Goessner ont des règles réellement différentes dans les cas limites — espaces et guillemets des filtres, ordre des unions, comparaison des membres manquants, et fonctions disponibles. Une expression écrite pour un moteur peut correspondre différemment (ou ne pas s'analyser) dans l'autre. Si vous avez copié une expression d'un ancien outil tel que jsonpath.com, jsonpath-plus ou un service basé sur Jayway, basculez le commutateur de moteur en haut sur Classique (Goessner) : ce mode exécute un évaluateur compatible Goessner (construit sur jsonpath-plus, configuré avec eval désactivé) et reproduira le comportement que vous avez observé dans l'outil source. Si vous écrivez une nouvelle expression ou ciblez un système annonçant la conformité à RFC 9535, conservez le moteur RFC 9535 par défaut. L'aide-mémoire et les exemples intégrés sont écrits pour s'évaluer de façon identique dans les deux moteurs afin de vous offrir un point de départ fiable.
Comment fonctionnent les expressions de filtre [?()] ?
Un sélecteur de filtre ne conserve que les éléments de tableau (ou les membres d'objet) pour lesquels un prédicat est vrai. À l'intérieur du filtre, @ désigne l'élément courant testé. $.store.book[?(@.price < 10)] renvoie chaque livre dont le membre price est inférieur à 10. Vous pouvez comparer à des littéraux (@.isbn, @.category == 'fiction'), combiner des conditions avec && et ||, tester l'existence d'un membre (@.isbn sélectionne les éléments qui possèdent un isbn), et, dans RFC 9535, utiliser les extensions de fonction dans le prédicat (?(length(@.tags) > 2)). Les opérateurs de comparaison sont ==, !=, <, <=, >, >=. RFC 9535 est précise sur les types : comparer un membre manquant à une valeur est bien défini et ne lève pas d'erreur. Le dialecte classique est plus souple sur les espaces, donc [?(@.price<10)] et [?(@.price < 10)] y sont tous deux acceptés ; RFC 9535 suit sa grammaire à la lettre.
Que fait la descente récursive (..) ?
L'opérateur .. parcourt chaque niveau du document, pas seulement les enfants directs. $..author collecte chaque membre author où qu'il se trouve — dans l'objet de premier niveau, dans les tableaux, dans les objets imbriqués, à n'importe quelle profondeur. C'est le moyen le plus rapide d'extraire un champ d'une structure profondément imbriquée ou de forme irrégulière quand vous ne voulez pas (ou ne pouvez pas) écrire le chemin complet. Vous pouvez faire suivre .. de n'importe quel sélecteur : $..book[*] trouve chaque élément de chaque tableau book partout dans l'arbre, $..* énumère chaque valeur du document, et $..['price'] rassemble tous les membres price. La descente récursive peut correspondre à beaucoup d'éléments — passez à la vue Chemins pour voir exactement d'où provient chaque résultat via son chemin normalisé.
Que sont les fonctions RFC 9535 length(), count(), match(), search() et value() ?
RFC 9535 définit cinq extensions de fonction standard, et la règle clé est qu'elles ne peuvent être appelées qu'à l'intérieur d'une expression de filtre [?...] — jamais comme segment de chemin autonome. Écrire $.store.book.length() n'est pas du RFC 9535 valide et la grammaire standard le rejette (cette forme d'appel de segment est une extension jsonpath-plus, pas une partie de la spécification). length() renvoie la longueur d'une chaîne, d'un tableau ou d'un objet, vous l'utilisez donc pour filtrer par taille : $.store.book[?length(@.title) > 15] conserve les livres dont le titre dépasse 15 caractères. count() renvoie le nombre de nœuds que contient une liste de nœuds, là encore dans un filtre : $.store.book[?(count(@.authors) > 1)]. match() teste si une chaîne correspond à une expression régulière sur la valeur entière, et search() teste une correspondance n'importe où dans la chaîne — les deux prennent un motif I-Regexp. value() convertit une liste de nœuds à un seul nœud en sa valeur afin de pouvoir l'utiliser dans une comparaison. Ces fonctions font partie du standard RFC 9535, elles sont donc disponibles dans le moteur par défaut ; le moteur Classique (Goessner) ne les implémente pas. Si une expression basée sur une fonction échoue, vérifiez que vous l'appelez à l'intérieur d'un filtre et que le commutateur de moteur est réglé sur RFC 9535.
Comment fonctionnent les tranches de tableau [start:end:step] ?
Les tranches utilisent la même convention semi-ouverte que Python et JavaScript : [start:end] sélectionne de l'indice start jusqu'à l'indice end exclu, donc [0:2] renvoie les deux premiers éléments (indices 0 et 1). Omettez une borne pour aller jusqu'au bord — [2:] à partir de l'indice 2, [:3] pour les trois premiers. Un indice négatif compte à partir de la fin : [-1:] sélectionne le dernier élément. Le troisième champ facultatif est un pas — [::2] prend un élément sur deux, [::-1] inverse (dans les moteurs qui prennent en charge les pas négatifs). La borne de fin exclusive est le bug de tranche le plus courant ; la vue Chemins indique l'indice exact de chaque élément sélectionné pour que vous confirmiez la limite d'un coup d'œil.
Qu'est-ce qu'un sélecteur d'union et comment sélectionner plusieurs clés à la fois ?
Un sélecteur d'union liste plusieurs noms ou indices à l'intérieur d'un même crochet et les rassemble tous : $['title','author'] sélectionne les deux membres d'un objet, et $.store.book[0,2] sélectionne le premier et le troisième élément du tableau book. Vous pouvez le combiner avec d'autres sélecteurs — $.store.book[*]['title','price'] extrait le titre et le prix de chaque livre. Les unions sont pratiques quand vous voulez une projection fixe de quelques champs plutôt qu'un objet entier ou un joker. La vue Les deux est la façon la plus claire de lire un résultat d'union, car elle associe chaque valeur sélectionnée à son chemin normalisé, ce qui vous permet de savoir quel nom ou quel indice a produit chaque entrée.
Puis-je partager une requête JSONPath et son JSON via un lien ?
Oui — et le lien n'implique aucun aller-retour avec le serveur. Cliquez sur Copier le lien dans la barre d'action : le testeur encode le JSON, l'expression, le moteur actif et la vue des résultats dans le fragment de l'URL. Quiconque ouvre le lien recharge la page avec le même état, localement sur sa propre machine. Comme les données vivent dans le fragment de l'URL, elles ne sont jamais transmises au serveur go-tools.org — les navigateurs n'envoient pas le fragment dans les requêtes HTTP — et elles n'apparaissent jamais dans nos journaux d'accès. La longueur du lien augmente avec la taille du JSON, donc pour les documents volumineux, partagez seulement l'expression et laissez le destinataire coller ses propres données, ou utilisez le bouton Téléverser pour charger un fichier localement. Cela rend les liens permanents sûrs pour le débogage collaboratif sans exposer la charge utile à un quelconque backend.
Y a-t-il une taille JSON maximale ?
L'évaluation est limitée par la mémoire de votre navigateur plutôt que par un plafond rigide, mais l'optimum pratique se situe pour les documents jusqu'à quelques mégaoctets — confortablement plus que presque toute réponse d'API unique. Les très grands tableaux avec des sélecteurs larges (un joker récursif $..* sur des dizaines de milliers de nœuds) produiront un grand ensemble de résultats plus long à afficher ; affinez l'expression pour garder la sortie lisible. Le bouton Téléverser lit un fichier .json ou .txt entièrement dans le navigateur (il n'est jamais envoyé nulle part), et Formater le JSON réindente l'entrée pour que vous puissiez lire la structure avant de la requêter. Pour les pipelines de données de plusieurs mégaoctets, validez votre expression ici sur une tranche représentative, puis exécutez le même chemin dans le code de votre application ou dans un outil en ligne de commande comme jq.
En quoi est-ce différent de jsonpath.com et est-ce sûr — sans eval ?
Quatre différences. (1) Confidentialité : jsonpath.com et la plupart des évaluateurs en ligne s'exécutent sur un serveur ou intègrent une bibliothèque qui évalue les filtres avec eval de JavaScript ; cet outil s'exécute entièrement dans votre navigateur et n'utilise aucun eval. Le moteur RFC 9535 par défaut est une implémentation sans dépendance et sans chemin eval, et le moteur Classique (Goessner) est construit sur jsonpath-plus épinglé à une version corrigée avec eval explicitement désactivé — ce qui ferme la classe de bugs d'exécution de code à distance suivie sous CVE-2024-21534 et CVE-2025-1302. Cela signifie aussi que l'outil fonctionne sous une Content-Security-Policy stricte. (2) Standards : c'est l'un des rares testeurs en ligne à proposer un véritable moteur RFC 9535, et pas seulement l'ancien dialecte de Goessner. (3) Double moteur : vous pouvez basculer entre RFC 9535 et Classique pour comparer les résultats ou exécuter des expressions copiées d'anciens outils, côte à côte. (4) Langues : l'interface est disponible en 15 langues. Si vous n'avez besoin que de vérifications rapides en syntaxe ancienne, jsonpath.com fonctionne encore ; pour une évaluation conforme aux standards, privée et sans eval, ceci est le choix le plus sûr.
Qu'affichent les vues Valeurs, Chemins et Les deux ?
Le résultat d'une requête JSONPath est une liste de nœuds — un ensemble de nœuds dans votre document. La vue Valeurs rend ces nœuds sous forme de tableau JSON des valeurs correspondantes, exactement ce que vous consommeriez dans le code. La vue Chemins rend plutôt le chemin normalisé de chaque correspondance — un emplacement canonique entre crochets et guillemets tel que $['store']['book'][0]['title'] qui identifie de façon unique où se trouve la valeur dans le document, quelle que soit la façon dont votre expression a été écrite. Les chemins normalisés sont un concept de RFC 9535 et sont précieux pour le débogage : deux expressions différentes qui sélectionnent le même nœud produisent le même chemin normalisé. La vue Les deux affiche les deux côte à côte pour que vous associiez chaque valeur à son emplacement d'un coup d'œil. La vue choisie persiste entre les sessions via localStorage.
Cela fonctionne-t-il hors ligne, et qu'en est-il d'une Content-Security-Policy ?
Oui sur les deux points. Comme chaque évaluation s'exécute dans votre navigateur sans appel réseau, l'outil continue de fonctionner une fois la page chargée, même si vous passez hors ligne. Et comme aucun des moteurs n'utilise eval ni le constructeur Function pour évaluer les expressions de filtre, l'outil fonctionne sous une Content-Security-Policy stricte qui interdit unsafe-eval — la politique que de nombreuses organisations soucieuses de sécurité imposent et qui casse les bibliothèques JSONPath basées sur eval. Le moteur RFC 9535 analyse et interprète les expressions avec sa propre grammaire plutôt que de les compiler en JavaScript, et le moteur Classique est configuré avec eval désactivé. Si vous devez évaluer du JSONPath dans un environnement interne renforcé, cet outil est conçu pour y fonctionner sans exceptions de politique.