Guide des requĂȘtes JSONPath : Extraire des donnĂ©es comme un pro
JSONPath est un langage de requĂȘte pour JSON, similaire Ă la façon dont XPath fonctionne pour XML. Lorsque vous travaillez avec des rĂ©ponses API complexes et profondĂ©ment imbriquĂ©es, JSONPath vous permet d'extraire exactement les donnĂ©es dont vous avez besoin sans Ă©crire de boucles ni de conditions. Ce guide couvre la syntaxe, les opĂ©rateurs et les patterns concrets dont vous avez besoin.
Pourquoi JSONPath ?
Considérez une réponse API typique avec des données imbriquées :
{
"store": {
"books": [
{ "title": "Clean Code", "author": "Robert Martin", "price": 32.99, "tags": ["programming", "best-practices"] },
{ "title": "Design Patterns", "author": "Gang of Four", "price": 44.99, "tags": ["programming", "architecture"] },
{ "title": "The Pragmatic Programmer", "author": "Hunt & Thomas", "price": 39.99, "tags": ["programming", "career"] }
],
"music": [
{ "title": "Kind of Blue", "artist": "Miles Davis", "price": 12.99 }
]
}
}
Pour obtenir tous les titres de livres, vous pourriez Ă©crire une boucle â ou utiliser JSONPath : $.store.books[*].title
Syntaxe de base
| Expression | Description |
|---|---|
$ | Objet racine |
. | Opérateur enfant |
.. | Descente récursive (recherche à tous les niveaux) |
[*] | Joker (tous les éléments) |
[n] | Index de tableau (base 0) |
[n,m] | Indices multiples |
[start:end:step] | Découpage de tableau |
[?()] | Expression de filtre |
@ | ĂlĂ©ment courant (dans les filtres) |
Notation par points vs notation par crochets
Les deux notations accÚdent aux propriétés, mais la notation par crochets est requise pour les caractÚres spéciaux :
# Notation par points
$.store.books[0].title
# Notation par crochets (équivalent)
$['store']['books'][0]['title']
# Requis pour les clés avec caractÚres spéciaux
$['store']['price-range']
Opérations sur les tableaux
Indexation
$.store.books[0] # Premier livre
$.store.books[-1] # Dernier livre
$.store.books[0,2] # Premier et troisiĂšme livres
Découpage
$.store.books[0:2] # Deux premiers livres (index 0 et 1)
$.store.books[1:] # Tous les livres sauf le premier
$.store.books[:2] # Deux premiers livres
$.store.books[::2] # Un livre sur deux
Jokers
$.store.books[*].title # Tous les titres de livres
$.store.* # Toutes les collections du magasin (books, music)
$..title # Tous les titres Ă n'importe quelle profondeur
$..price # Tous les prix Ă n'importe quelle profondeur
L'opérateur de descente récursive (..) est particuliÚrement puissant pour extraire des valeurs indépendamment de leur position dans la hiérarchie.
Expressions de filtre
Les filtres sélectionnent des éléments en fonction de conditions :
# Livres Ă moins de 40 $
$.store.books[?(@.price < 40)]
# Livres d'un auteur spécifique
$.store.books[?(@.author == 'Robert Martin')]
# Livres avec plus de 2 tags
$.store.books[?(@.tags.length > 2)]
# Livres qui ont une propriété 'price'
$.store.books[?(@.price)]
Combiner des filtres
# Livres Ă moins de 40 $ avec le tag programming
$.store.books[?(@.price < 40 && @.tags[0] == 'programming')]
Exemples concrets
Extraction depuis des réponses API
API GitHub â obtenir tous les noms de dĂ©pĂŽts :
$[*].name
API MĂ©tĂ©o â obtenir la tempĂ©rature du jour :
$.daily[0].temp.day
API E-commerce â obtenir toutes les images de produits :
$.products[*].images[0].url
Extraction de configuration
Docker Compose â obtenir tous les noms de services :
$.services.*~
Package.json â obtenir tous les noms de dĂ©pendances :
$.dependencies.*~
JSONPath vs jq
JSONPath et jq sont tous deux des outils de requĂȘte JSON, mais ils servent des contextes diffĂ©rents :
| Fonctionnalité | JSONPath | jq |
|---|---|---|
| Environnement | BibliothĂšques, API | Ligne de commande |
| Syntaxe | Inspirée de XPath | Fonctionnelle personnalisée |
| Transformation | RequĂȘte uniquement | RequĂȘte + transformation |
| Standard | RFC 9535 | Standard de facto |
Pour le traitement JSON en ligne de commande, jq est plus puissant. Pour intĂ©grer des requĂȘtes dans des applications ou utiliser des outils web, JSONPath est plus largement supportĂ©.
Essayez les expressions JSONPath de maniĂšre interactive avec notre Explorateur JSON Path. Collez votre JSON, Ă©crivez une requĂȘte et voyez les rĂ©sultats instantanĂ©ment.
Exemples d'implémentation
JavaScript (jsonpath-plus)
const { JSONPath } = require('jsonpath-plus');
const result = JSONPath({
path: '$.store.books[?(@.price < 40)].title',
json: data
});
// ["Clean Code", "The Pragmatic Programmer"]
Python (jsonpath-ng)
from jsonpath_ng import parse
expr = parse('$.store.books[*].title')
titles = [match.value for match in expr.find(data)]
RFC 9535 : Le standard JSONPath
En février 2024, JSONPath a été officiellement standardisé sous le nom RFC 9535. Cela résout les incohérences historiques entre les implémentations. Comportements standardisés clés :
- Les indices de tableau commencent Ă 0
- Les expressions de filtre utilisent
@pour l'élément courant - La comparaison de chaßnes est sensible à la casse
- Le résultat est toujours un tableau de valeurs correspondantes
Si vous choisissez une bibliothÚque JSONPath, préférez-en une qui supporte RFC 9535 pour un comportement cohérent.
FAQ
Quelle est la différence entre JSONPath et JSON Pointer ?
JSONPath est un langage de requĂȘte qui peut correspondre Ă plusieurs valeurs en utilisant des jokers et des filtres. JSON Pointer (RFC 6901) est une syntaxe de chemin simple qui adresse exactement une valeur : /store/books/0/title. Utilisez JSONPath quand vous devez rechercher ou filtrer ; utilisez JSON Pointer quand vous connaissez le chemin exact.
JSONPath peut-il modifier des données JSON ?
Le JSONPath standard est en lecture seule â il extrait mais ne modifie pas les donnĂ©es. Certaines bibliothĂšques Ă©tendent JSONPath avec des opĂ©rations set/delete, mais celles-ci ne sont pas standard. Pour les transformations, envisagez jq (ligne de commande) ou Ă©crivez du code applicatif. Pour visualiser et explorer la structure JSON, notre Formateur JSON vous aide Ă comprendre les donnĂ©es avant d'Ă©crire des requĂȘtes.
Ressources connexes
- Explorateur JSON Path â Testez les expressions JSONPath dans votre navigateur
- Bonnes pratiques de formatage JSON â Structurez votre JSON pour des requĂȘtes plus faciles
- Guide de validation JSON Schema â Validez la structure que vos requĂȘtes JSONPath attendent