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.
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.
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). |
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.
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.
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( )
.
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 \
.
{
"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 |