ToolDeck

Testeur JSONPath

Testez des expressions JSONPath sur des données JSON et visualisez les résultats correspondants

Essayer un exemple

JSON en entrée

Résultats

Fonctionne localement · Sûr pour coller des secrets
Les résultats s'afficheront ici…

Qu'est-ce que JSONPath ?

JSONPath est un langage de requête permettant d'extraire des valeurs de documents JSON. Proposé à l'origine par Stefan Goessner en 2007 comme équivalent de XPath pour XML, JSONPath vous permet d'écrire des expressions telles que $.store.book[*].author pour sélectionner tous les champs auteur dans un tableau de livres, sans écrire de boucles ni de code de parcours manuel. Le langage a été normalisé en février 2024 sous la forme de la RFC 9535, publiée par l'IETF.

Une expression JSONPath commence toujours par $ qui représente la racine du document. À partir de là, vous enchaînez des sélecteurs : la notation pointée pour les clés d'objet, la notation entre crochets pour les indices de tableau, les jokers pour tous les enfants, et l'opérateur de descente récursive (..) pour parcourir chaque niveau d'imbrication. Les expressions de filtre telles que [?(@.price < 10)] permettent de sélectionner des éléments en fonction de conditions évaluées sur leurs valeurs.

JSONPath est utilisé dans des outils de test d'API comme Postman, des plateformes d'observabilité comme Datadog et Splunk, des moteurs de workflow comme Apache NiFi, et des bibliothèques de programmation en JavaScript, Python, Go, Java et C#. Tester vos expressions sur des données réelles avant de les intégrer dans du code ou des fichiers de configuration évite les erreurs silencieuses lorsque la structure JSON ne correspond pas à vos hypothèses.

Pourquoi utiliser ce testeur JSONPath ?

Écrire des expressions JSONPath à la main est source d'erreurs. Un point manquant, un mauvais type de crochet ou une syntaxe de filtre incorrecte peut retourner des résultats vides sans message d'erreur. Cet outil vous donne un retour visuel immédiat sur ce que votre expression correspond.

Résultats instantanés
Collez du JSON, saisissez une expression et voyez les valeurs correspondantes se mettre à jour en temps réel. Inutile d'exécuter un script ou de recharger une page pour vérifier votre requête.
🔒
Respect de la vie privée
Toute l'évaluation s'effectue dans votre navigateur. Vos données JSON ne quittent jamais votre machine, ce qui vous permet de tester des expressions en toute sécurité sur des réponses d'API en production ou des fichiers de configuration contenant des identifiants.
📋
Copiez les résultats directement
Copiez la sortie correspondante en JSON en un clic. Collez-la dans des assertions de tests, de la documentation ou des exemples de réponses d'API sans reformatage.
🛠️
Aucune installation requise
Pas de paquets npm à installer, pas d'environnements virtuels Python à créer. Ouvrez la page, collez vos données et commencez à interroger. Fonctionne sur tout appareil disposant d'un navigateur.

Cas d'utilisation de JSONPath

Développement frontend
Extrayez les valeurs imbriquées exactes dont vous avez besoin depuis les réponses d'API avant de les intégrer dans l'état React ou les propriétés calculées Vue. Testez d'abord vos expressions de chemin sur la charge utile réelle de l'API.
Tests d'API backend
Postman et REST-assured utilisent JSONPath pour vérifier les corps de réponse. Construisez et validez vos expressions d'assertion ici avant de les copier dans des scripts de test, ce qui réduit les cycles de débogage.
Configuration DevOps
Les définitions de ressources personnalisées Kubernetes, AWS Step Functions et les sources de données Terraform acceptent des expressions JSONPath pour extraire des valeurs des sorties JSON. Validez votre chemin avant de déployer.
Automatisation des tests QA
Rédigez des assertions basées sur JSONPath pour les tests de contrat et les tests d'intégration. Vérifiez que vos expressions correspondent correctement aux valeurs attendues lorsque la structure JSON comporte des champs optionnels ou nullables.
Extraction dans les pipelines de données
Apache NiFi, Logstash et les scripts ETL personnalisés utilisent JSONPath pour extraire des champs de données de journaux semi-structurées et de flux d'événements. Testez les expressions sur des charges utiles d'exemple avant le déploiement du pipeline.
Apprentissage et expérimentation
Les étudiants et les développeurs qui découvrent JSONPath peuvent essayer différentes expressions sur des exemples JSON pour comprendre le fonctionnement des jokers, de la descente récursive et des filtres, sans environnement local.

Référence de la syntaxe JSONPath

La RFC 9535 définit la syntaxe JSONPath standard. Le tableau ci-dessous présente les opérateurs que vous utiliserez dans la plupart des requêtes. Toutes les expressions commencent par $ (le nœud racine) et enchaînent un ou plusieurs sélecteurs pour naviguer dans la structure du document.

OpérateurDescriptionExemple
$Root element$.store
.keyChild property$.store.book
[n]Array index (zero-based)$.store.book[0]
[*]All elements in array/object$.store.book[*]
..Recursive descent$..author
[start:end]Array slice$.store.book[0:2]
[?()]Filter expression$.store.book[?(@.price<10)]
@Current node (inside filter)$.store.book[?(@.isbn)]

JSONPath vs jq vs XPath

JSONPath, jq et XPath résolvent le même problème (interroger des données structurées) pour différents formats et cas d'usage. JSONPath cible JSON et est disponible en tant que bibliothèque dans la plupart des langages. jq est un outil CLI autonome avec son propre langage de filtres Turing-complet. XPath opère sur XML et fait partie de la pile de spécifications W3C.

FonctionnalitéJSONPathjqXPath
Format de donnéesJSONJSONXML
Accéder au premier élément$.store.book[0].store.book[0]/store/book[1]
Recherche récursive$..price.. | .price?//price
Expression de filtre[?(@.price<10)]select(.price < 10)[price<10]
SpécificationRFC 9535stedolan.github.ioW3C XPath 3.1

Exemples de code

Comment évaluer des expressions JSONPath dans les langages et outils les plus courants. Chaque exemple utilise la même structure JSON de librairie pour la comparaison.

JavaScript (jsonpath-plus)
import { JSONPath } from 'jsonpath-plus';

const data = {
  store: {
    book: [
      { title: 'Moby Dick', price: 8.99 },
      { title: 'The Great Gatsby', price: 12.99 }
    ]
  }
};

// Get all book titles
JSONPath({ path: '$.store.book[*].title', json: data });
// → ['Moby Dick', 'The Great Gatsby']

// Recursive descent — find every price in the document
JSONPath({ path: '$..price', json: data });
// → [8.99, 12.99]

// Filter — books under $10
JSONPath({ path: '$.store.book[?(@.price < 10)]', json: data });
// → [{ title: 'Moby Dick', price: 8.99 }]
Python (jsonpath-ng)
from jsonpath_ng.ext import parse
import json

data = {
    "store": {
        "book": [
            {"title": "Moby Dick", "price": 8.99},
            {"title": "The Great Gatsby", "price": 12.99}
        ]
    }
}

# Get all book titles
expr = parse("$.store.book[*].title")
titles = [match.value for match in expr.find(data)]
# → ['Moby Dick', 'The Great Gatsby']

# Recursive descent — all prices
expr = parse("$..price")
prices = [match.value for match in expr.find(data)]
# → [8.99, 12.99]

# Filter — books under $10
expr = parse("$.store.book[?price < 10]")
cheap = [match.value for match in expr.find(data)]
# → [{"title": "Moby Dick", "price": 8.99}]
Go (ohler55/ojg)
package main

import (
    "fmt"
    "github.com/ohler55/ojg/jp"
    "github.com/ohler55/ojg/oj"
)

func main() {
    src := `{
        "store": {
            "book": [
                {"title": "Moby Dick", "price": 8.99},
                {"title": "The Great Gatsby", "price": 12.99}
            ]
        }
    }`

    obj, _ := oj.ParseString(src)

    // Get all book titles
    expr, _ := jp.ParseString("$.store.book[*].title")
    results := expr.Get(obj)
    fmt.Println(results)
    // → [Moby Dick The Great Gatsby]

    // Recursive descent — all prices
    expr2, _ := jp.ParseString("$..price")
    fmt.Println(expr2.Get(obj))
    // → [8.99 12.99]
}
CLI (jq alternative syntax)
# jq uses its own syntax, not JSONPath, but solves the same problem.
# Mapping common JSONPath patterns to jq:

# $.store.book[*].title → get all titles
echo '{"store":{"book":[{"title":"Moby Dick"},{"title":"Gatsby"}]}}' | \
  jq '.store.book[].title'
# → "Moby Dick"
# → "Gatsby"

# $..price → recursive descent for "price" keys
echo '{"a":{"price":1},"b":{"price":2}}' | \
  jq '.. | .price? // empty'
# → 1
# → 2

# Filter: books where price < 10
echo '{"store":{"book":[{"title":"A","price":8},{"title":"B","price":12}]}}' | \
  jq '.store.book[] | select(.price < 10)'
# → {"title":"A","price":8}

Questions fréquentes

Quelle est la différence entre JSONPath et jq ?
JSONPath est un langage de requête conçu pour être intégré dans des applications en tant que bibliothèque. Il retourne les valeurs correspondantes d'un document JSON à l'aide d'expressions de chemin. jq est un outil en ligne de commande autonome doté d'un langage de programmation complet pour transformer du JSON, incluant des conditionnelles, des fonctions et de l'interpolation de chaînes. Utilisez JSONPath lorsque vous avez besoin d'une requête intégrée dans du code ou un outil comme Postman. Utilisez jq pour la transformation de données ad hoc en ligne de commande.
JSONPath est-il une norme officielle ?
Oui. L'IETF a publié la RFC 9535 ("JSONPath: Query Expressions for JSON") en février 2024. Avant cela, JSONPath n'existait que comme spécification informelle de Stefan Goessner datant de 2007, ce qui avait conduit à des incohérences entre les implémentations. La RFC 9535 définit la syntaxe, la sémantique et un format de normalisation pour l'interopérabilité.
Comment fonctionne la descente récursive (..) dans JSONPath ?
L'opérateur de descente récursive (..) parcourt chaque niveau du document JSON à la recherche de la clé qui le suit. Par exemple, $..price retourne toutes les valeurs associées à la clé "price", quelle que soit la profondeur d'imbrication. C'est l'équivalent d'un parcours en profondeur d'abord qui collecte les nœuds correspondants. Notez que sur des documents volumineux, la descente récursive peut retourner de nombreux résultats et être plus lente qu'un chemin direct.
JSONPath peut-il modifier des données JSON ?
Non. JSONPath est un langage de requête en lecture seule. Il sélectionne et retourne des valeurs, mais ne peut pas insérer, mettre à jour ou supprimer des nœuds. Pour modifier du JSON à partir d'une expression JSONPath, vous devez utiliser les fonctions de manipulation JSON de votre langage de programmation après la requête. Certaines bibliothèques comme jsonpath-ng en Python fournissent une méthode set() sur les objets de correspondance, mais il s'agit d'une extension de bibliothèque, pas de la spécification JSONPath.
Que signifie le symbole @ dans les expressions de filtre JSONPath ?
Le symbole @ fait référence au nœud courant évalué dans une expression de filtre. Dans $.store.book[?(@.price < 10)], le filtre itère sur chaque élément du tableau book, et @ représente chaque objet livre à tour de rôle. @.price accède au champ price du livre courant. Sans @, le filtre ne saurait pas quelles propriétés de quel nœud vérifier.
Comment gérer les clés avec des caractères spéciaux ou des espaces en JSONPath ?
Utilisez la notation entre crochets avec des guillemets : $['store']['book title']. La notation entre crochets fonctionne pour n'importe quelle clé, y compris celles contenant des points, des espaces ou des caractères Unicode. La notation pointée ($.store.key) ne fonctionne que pour les clés qui sont des identifiants valides (lettres, chiffres, underscores). La RFC 9535 exige que les implémentations prennent en charge la notation entre crochets avec guillemets simples et doubles.
Pourquoi mon expression JSONPath retourne-t-elle des résultats vides ?
Les causes les plus fréquentes sont : une faute de frappe dans un nom de clé (JSONPath est sensible à la casse), l'utilisation de la notation pointée pour une clé contenant des caractères spéciaux, l'absence du symbole racine $ au début, ou la supposition qu'une valeur est un tableau alors que c'est un objet unique. Collez votre JSON dans un outil de test et essayez d'abord des sous-expressions plus simples (comme $.store) pour vérifier que chaque segment de votre chemin se résout correctement avant d'ajouter d'autres sélecteurs.