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.
| XPath | JSONPath | Description |
|---|---|---|
| / | $ | l'élément XML racine |
| . | @ | l'élément XML courant |
| / | . ou [] | opérateur enfant |
| .. | n/a | opérateur parent |
| // | ..name, | descendants (JSONPath emprunte |
| ..[index], ..*, | cette syntaxe à E4X) | |
| ou ..[*] | ||
| * | * | joker : tous les éléments XML |
| quel que soit leur nom | ||
| @ | n/a | accè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) | ||
| seamless | n/a | moteur d'expressions |
| () | n/a | regroupement |
Tableau 20 : Syntaxe XPath comparée à JSONPath
Pour illustration supplémentaire, le tableau 21 montre quelques expressions XPath et leurs équivalents JSONPath.
| XPath | JSONPath | Résultat |
|---|---|---|
| /store/book/author | $.store.book[*].author | les auteurs |
| de tous les livres | ||
| du magasin | ||
| //author | $..author | tous les auteurs |
| /store/* | $.store.* | tout ce qui est dans |
| le magasin : des | ||
| livres et un vélo rouge | ||
| /store//price | $.store..price | les 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.