Aller au contenu principal

Appendix B. Inspired by XPath (Inspiré par XPath)

Appendix B. Inspired by XPath (Inspiré par XPath)

Cet appendice est informatif.

À l'époque de l'invention de JSONPath, XML était réputé pour la disponibilité d'outils puissants pour analyser, transformer et extraire sélectivement des données de documents XML. [XPath] est l'un de ces outils.

En 2007, le besoin d'un mécanisme résolvant la même classe de problèmes pour la communauté JSON émergente est devenu évident, notamment pour :

  • trouver des données de façon interactive et les extraire de valeurs JSON

[RFC8259] sans script spécial, et

  • spécifier les parties pertinentes des données JSON dans une requête client, afin que le serveur puisse réduire la quantité de données dans sa réponse, minimisant l'utilisation de bande passante.

(Note : XPath a évolué depuis 2007, et les versions récentes supportent même nominalement l'exécution à l'intérieur de valeurs JSON. Cet appendice ne traite que de la version XPath la plus répandue disponible en 2007.)

JSONPath reprend la philosophie générale d'XPath mais mappe les concepts vers une syntaxe (et partiellement une sémantique) familière à quelqu'un utilisant JSON dans un langage dynamique.

Par exemple, dans des langages de programmation dynamiques populaires tels que JavaScript, Python et PHP, la sémantique de l'expression XPath :

/store/book[1]/title

peut se concrétiser dans l'expression :

x.store.book[0].title

ou en notation entre crochets :

x['store']['book'][0]['title']

avec la variable x tenant l'argument de requête.

Le langage JSONPath a été conçu pour :

  • être naturellement fondé sur ces caractéristiques de langage,

  • ne couvrir que les parties les plus essentielles de XPath 1.0,

  • être léger en taille de code et consommation mémoire, et

  • être efficace à l'exécution.

B.1. JSONPath and XPath (JSONPath et XPath)

Les expressions JSONPath s'appliquent aux valeurs JSON comme les expressions XPath le font avec un document XML. JSONPath utilise $ pour désigner le nœud racine de l'argument de requête, similaire au / initial de XPath.

Les expressions JSONPath descendent dans la hiérarchie en utilisant la notation point ($.store.book[0].title) ou la notation entre crochets ($['store']['book'][0]['title']) ; toutes deux remplacent le / de XPath dans les expressions de requête, où la notation point est une syntaxe légère mais limitée tandis que la notation entre crochets est plus générale mais plus lourde.

JSONPath et XPath utilisent tous deux * comme joker. La notation de segment descendant de JSONPath, commençant par .., empruntée à [E4X], est similaire au // de XPath. Le construit de découpe de tableau [start:end:step] est propre à JSONPath, inspiré par [SLICE] d'ECMASCRIPT 4.

Les expressions de filtre sont supportées via la syntaxe ?<logical-expr> comme dans :

$.store.book[[email protected] < 10].title

Le tableau 20 étend le tableau 1 en fournissant une comparaison avec des concepts XPath similaires.

XPathJSONPathDescription
/$l'élément XML racine
.@l'élément XML courant
/. ou []opérateur enfant
..n/aopérateur parent
//..name,descendants (JSONPath emprunte
..[index], ..*,cette syntaxe à E4X)
ou ..[*]
**joker : tous les éléments XML
quel que soit leur nom
@n/aaccès attribut : les valeurs JSON
n'ont pas d'attributs
[][]opérateur d'indice pour itérer
sur des collections d'éléments XML
et pour les prédicats
[,]opérateur d'union (résultat en
combinaison d'ensembles de nœuds) ;
appelé opérateur de liste en JSONPath,
permet de combiner noms de membres,
indices de tableau et tranches
n/a[start:end:step]opérateur de tranche de tableau
emprunté à ES4
[]?applique une expression de filtre
(script)
seamlessn/amoteur d'expressions
()n/aregroupement

Tableau 20 : Syntaxe XPath comparée à JSONPath

Pour illustration supplémentaire, le tableau 21 montre quelques expressions XPath et leurs équivalents JSONPath.

XPathJSONPathRésultat
/store/book/author$.store.book[*].authorles auteurs
de tous les livres
du magasin
//author$..authortous les auteurs
/store/*$.store.*tout ce qui est dans
le magasin : des
livres et un vélo rouge
/store//price$.store..priceles prix de
tout dans le magasin
//book[3]$..book[2]le troisième
livre
//book[last()]$..book[-1]le dernier livre
dans l'ordre
//book[position()<3]$..book[0,1]les deux premiers
$..book[:2]livres
//book[isbn]$..book[[email protected]]filtrer tous
les livres avec ISBN
//book[price<10]$..book[[email protected]<10]filtrer tous
les livres à moins de 10
//*$..*tous les éléments
d'un document XML ;
toutes les valeurs de membre
et éléments de tableau
dans la valeur d'entrée

Tableau 21 : Exemples d'expressions XPath et équivalents JSONPath

XPath offre beaucoup plus de fonctionnalités (chemins d'emplacement en syntaxe non abrégée, opérateurs et fonctions) que listé dans cette comparaison. De plus, il existe des différences significatives dans le fonctionnement de l'opérateur d'indice entre XPath et JSONPath :

  • Les crochets dans les expressions XPath opèrent toujours sur l'ensemble de nœuds résultant du fragment de chemin précédent. Les indices commencent toujours à 1.

  • Avec JSONPath, les crochets opèrent sur chacun des nœuds de la nodelist résultant du segment de requête précédent. Les indices de tableau commencent toujours à 0.