This is a translation of the original English documentation page. Help us make it better.

3 Fonctionnalité JSONPath

Aperçu

Cette section fournit des détails sur la fonctionnalité JSONPath prise en charge dans les étapes de prétraitement de la valeur de l'élément.

JSONPath se compose de segments séparés par des points. Un segment peut être soit un mot simple comme un nom de valeur JSON, * ou une construction plus complexe entre crochets [ ]. Le point de séparation avant le segment entre crochets est facultatif et peut être omis. Par exemple:

Chemin Description
$.object.name Renvoie le contenu de object.name.
$.object['name'] Renvoie le contenu de object.name.
$.object.['name'] Renvoie le contenu de object.name.
$["object"]['name'] Renvoie le contenu de object.name.
$.['object'].["name"] Renvoie le contenu de object.name.
$.object.history.length() Renvoie le nombre d'éléments du tableau object.history.
$[?(@.name == 'Object')].price.first() Renvoie le champ price du premier objet avec le nom 'Object'.
$[?(@.name == 'Object')].history.first().length() Renvoie le nombre d'éléments du tableau history du premier objet avec le nom 'Object'.
$[?(@.price > 10)].length() Renvoie le nombre d'objets dont le prix est supérieur à 10.

Voir aussi : Echapper les caractères spéciaux des valeurs de macro LLD dans JSONPath.

Segments pris en charge

Segment Description
<nom> Faire correspondre la propriété de l'objet par son nom.
* Faire correspondre toutes les propriétés de l'objet.
['<nom>'] Faites correspondre la propriété de l'objet par son nom.
['<nom>', '<nom>', ...] Faites correspondre la propriété d'objet par l'un des noms répertoriés.
[<index>] Faites correspondre l'élément du tableau par l'index.
[<nombre>, <nombre>, ...] Faire correspondre l'élément de tableau par l'un des index répertoriés.
[*] Faire correspondre toutes les propriétés d'objet ou éléments de tableau.
[<début>:<fin>] Faire correspondre les éléments du tableau par la plage définie :
<début> - le premier index correspondant (compris). S'il n'est pas spécifié, correspond à tous les éléments du tableau depuis le début. Si négatif, spécifie le décalage de départ à partir de la fin du tableau.
<fin> - le dernier index correspondant (non compris). S'il n'est pas spécifié, correspond à tous les éléments du tableau jusqu'à la fin. Si négatif, spécifie le décalage de départ à partir de la fin du tableau.
[?(<expression>)] Faire correspondre des objets/éléments de tableau en appliquant une expression de filtre.

Pour trouver un segment correspondant en ignorant son ascendance (segment détaché), il doit être préfixé par '..' , par exemple $..nom ou $..['nom'] renvoient les valeurs de toutes les propriétés 'name'.

Les noms d'éléments correspondants peuvent être extraits en ajoutant un suffixe ~ au JSONPath. Il renvoie le nom de l'objet correspondant ou un index au format chaîne de l'élément de tableau correspondant. Le format de sortie suit les mêmes règles que les autres requêtes JSONPath - les résultats de chemin définis sont renvoyés 'tels quels' et les résultats de chemin indéfinis sont renvoyés dans un tableau. Cependant, il ne sert à rien d'extraire le nom d'un élément correspondant à un chemin défini - il est déjà connu.

Expression de filtre

L'expression de filtre est une expression arithmétique en notation infix.

Opérandes pris en charge :

Opérande Description Exemple
"<text>"
'<text>'
Constante de texte. 'value: \'1\''
"value: '1'"
<number> Constante numérique prenant en charge la notation scientifique. 123
<jsonpath starting with $> Valeur référencée par JSONPath à partir du nœud racine du document d'entrée ; seuls les chemins définis sont pris en charge. $.object.name
<jsonpath starting with @> Valeur référencée par le JSONPath à partir de l'objet/élément actuel ; seuls les chemins définis sont pris en charge. @.name

Opérateurs pris en charge :

Opérateur Type Description Résultat
- binaire Soustraction. Nombre.
+ binaire Addition. Nombre.
/ binaire Division. Nombre.
* binaire Multiplication. Nombre.
== binaire Est égal à. Booléen (1 ou 0).
!= binaire N'est pas égal à. Booléen (1 ou 0).
< binaire Est inférieur à. Booléen (1 ou 0).
<= binaire Est inférieur ou égal à. Booléen (1 ou 0).
> binaire Est supérieur à. Booléen (1 ou 0).
>= binaire Est supérieur ou égal à. Booléen (1 ou 0).
=~ binaire Correspond à l'expression régulière. Booléen (1 ou 0).
! unaire Non booléen. Booléen (1 ou 0).
|| binaire Ou booléen. Booléen (1 ou 0).
&& binaire Et booléen. Booléen (1 ou 0).

Fonctions

Les fonctions peuvent être utilisées à la fin d'un JSONPath. Plusieurs fonctions peuvent être chaînées si la fonction précédente renvoie une valeur acceptée par la fonction suivante.

Fonctions prises en charge :

Fonction Description Entrée Sortie
avg Valeur moyenne des nombres dans le tableau d'entrée. Tableau de nombres. Nombre.
min Valeur minimale des nombres dans le tableau d'entrée. Tableau de nombres. Nombre.
max Valeur maximale des nombres dans le tableau d'entrée. Tableau de nombres. Nombre.
sum Somme des nombres dans le tableau d'entrée. Tableau de nombres. Nombre.
length Nombre d'éléments dans le tableau d'entrée. Tableau. Nombre.
first Le premier élément du tableau. Tableau. Une construction JSON (objet, tableau, valeur) en fonction du contenu du tableau d'entrée.

Les valeurs numériques entre guillemets sont acceptées par les fonctions d'agrégation JSONPath. Cela signifie que les valeurs sont converties du type chaîne en numérique si l'agrégation est requise.

Une entrée incompatible entraînera la génération d'une erreur par la fonction.

Valeur de retour

JSONPaths peut être divisé en chemins définis et indéfinis. Un chemin défini ne peut renvoyer que null ou une seule correspondance. Un chemin indéfini peut renvoyer plusieurs correspondances, essentiellement des JSONPaths avec des listes de noms/index multiples, des morceaux de tableau ou des segments d'expression détachés. Cependant, lorsqu'une fonction est utilisée, le JSONPath devient défini, car les fonctions génèrent toujours une valeur unique.

Un chemin défini renvoie l'objet/tableau/valeur auquel il fait référence, tandis que le chemin indéfini renvoie un tableau des objets/tableaux/valeurs correspondants.

Espace blanc

Les espaces (espace, caractères de tabulation) peuvent être librement utilisés dans les segments et les expressions de notation entre parenthèses, par exemple,$[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( ).

Chaînes de caractères

Les chaînes doivent être entourées de guillemets simples ' ou doubles ". À l'intérieur des chaînes, les guillemets simples ou doubles (selon ceux qui sont utilisés pour les encadrer) et les barres obliques inverses \ sont échappés avec le caractère barre oblique inverse \.

Exemples

Données d'entrée
{
         "books": [
           {
             "category": "reference",
             "author": "Nigel Rees",
             "title": "Sayings of the Century",
             "price": 8.95,
             "id": 1
           },
           {
             "category": "fiction",
             "author": "Evelyn Waugh",
             "title": "Sword of Honour",
             "price": 12.99,
             "id": 2
           },
           {
             "category": "fiction",
             "author": "Herman Melville",
             "title": "Moby Dick",
             "isbn": "0-553-21311-3",
             "price": 8.99,
             "id": 3
           },
           {
             "category": "fiction",
             "author": "J. R. R. Tolkien",
             "title": "The Lord of the Rings",
             "isbn": "0-395-19395-8",
             "price": 22.99,
             "id": 4
           }
         ],
         "services": {
           "delivery": {
             "servicegroup": 1000,
             "description": "Next day delivery in local town",
             "active": true,
             "price": 5
           },
           "bookbinding": {
             "servicegroup": 1001,
             "description": "Printing and assembling book in A5 format",
             "active": true,
             "price": 154.99
           },
           "restoration": {
             "servicegroup": 1002,
             "description": "Various restoration methods",
             "active": false,
             "methods": [
               {
                 "description": "Chemical cleaning",
                 "price": 46
               },
               {
                 "description": "Pressing pages damaged by moisture",
                 "price": 24.5
               },
               {
                 "description": "Rebinding torn book",
                 "price": 99.49
               }
             ]
           }
         },
         "filters": {
           "price": 10,
           "category": "fiction",
           "no filters": "no \"filters\""
         },
         "closed message": "Store is closed",
         "tags": [
           "a",
           "b",
           "c",
           "d",
           "e"
         ]
       }
JSONPath Type Résultat Commentaires
$.filters.price défini 10
$.filters.category défini fiction
$.filters['no filters'] défini no "filters"
$.filters défini {
"price": 10,
"category": "fiction",
"no filters": "no \"filters\""
}
$.books[1].title défini Sword of Honour
$.books[-1].author défini J. R. R. Tolkien
$.books.length() défini 4
$.tags[:] indéfini ["a", "b", "c", "d", "e" ]
$.tags[2:] indéfini ["c", "d", "e" ]
$.tags[:3] indéfini ["a", "b", "c"]
$.tags[1:4] indéfini ["b", "c", "d"]
$.tags[-2:] indéfini ["d", "e"]
$.tags[:-3] indéfini ["a", "b"]
$.tags[:-3].length() défini 2
$.books[0, 2].title indéfini ["Sayings of the Century", "Moby Dick"]
$.books[1]['author', "title"] indéfini ["Evelyn Waugh", "Sword of Honour"]
$..id indéfini [1, 2, 3, 4]
$.services..price indéfini [5, 154.99, 46, 24.5, 99.49]
$.books[?(@.id == 4 - 0.4 * 5)].title indéfini ["Sword of Honour"] This query shows that arithmetical operations can be used in queries. Of course this query can be simplified to $.books[?(@.id == 2)].title
$.books[?(@.id == 2 \|\| @.id == 4)].title indéfini ["Sword of Honour", "The Lord of the Rings"]
$.books[?(!(@.id == 2))].title indéfini ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"]
$.books[?(@.id != 2)].title indéfini ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"]
$.books[?(@.title =~ " of ")].title indéfini ["Sayings of the Century", "Sword of Honour", "The Lord of the Rings"]
$.books[?(@.price > 12.99)].title indéfini ["The Lord of the Rings"]
$.books[?(@.author > "Herman Melville")].title indéfini ["Sayings of the Century", "The Lord of the Rings"]
$.books[?(@.price > $.filters.price)].title indéfini ["Sword of Honour", "The Lord of the Rings"]
$.books[?(@.category == $.filters.category)].title indéfini ["Sword of Honour","Moby Dick","The Lord of the Rings"]
$..[?(@.id)] indéfini [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95,
"id": 1
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99,
"id": 2
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99,
"id": 3
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99,
"id": 4
}
]
$.services..[?(@.price > 50)].description indéfini '["Printing and assembling book in A5 format", "Rebinding torn book"]
$..id.length() défini 4
$.books[?(@.id == 2)].title.first() défini Sword of Honour
$..tags.first().length() défini 5 $..tags is indefinite path, so it returns an array of matched elements - [["a", "b", "c", "d", "e" ]], first() returns the first element - ["a", "b", "c", "d", "e" ] and finally length() calculates its length - 5.
$.books[*].price.min() défini 8.95
$..price.max() défini 154.99
$.books[?(@.category == "fiction")].price.avg() défini 14.99
$.books[?(@.category == $.filters.xyz)].title indéfini A query without match returns NULL for definite and indefinite paths.
$.services[?(@.active=="true")].servicegroup indéfini [1000,1001] Text constants must be used in boolean value comparisons.
$.services[?(@.active=="false")].servicegroup indéfini [1002] Text constants must be used in boolean value comparisons.
$.services[?(@.servicegroup=="1002")]~.first() défini restoration