Áú»¢¶Ä²©

4 Funcionalitat JSONPath

Vista general

Aquesta secci¨® proporciona detalls sobre la funcionalitat JSONPath admesa a les passes de preprocessament del valor de l'element.

JSONPath consta de segments separats per punts. Un segment pot ¨¦sser una paraula simple com un nom de valor JSON, (*) o una construcci¨® m¨¦s complexa entre claud¨¤tors. El per¨ªode de separaci¨® abans del segment entre par¨¨ntesis ¨¦s opcional i es pot ometre. Per exemple:

°ä²¹³¾¨ª ¶Ù±ð²õ³¦°ù¾±±è³¦¾±¨®
$.object.name Retorna el contingut d'object.name.
$.object['name'] Retorna el contingut d'object.name.| |$.object.['name']|Retorna el contingut d'object.name.
$["object"]['name'] Retorna el contingut d'object.name.| |$.['object'].["name"]|Retorna el contingut d'object.name.
$.object.history.length() Retorna el nombre d'elements de la matriu object.history.
$[?(@.name == 'Objecte')].price.first() Retorna el camp de preu del primer objecte amb el nom "Objecte".
$[?(@.name == 'Objecte')].history.first().length() Retorna el nombre d'elements a la matriu d'historial del primer objecte amb el nom "Objecte".
$[?(@.price > 10)].length() Retorna el nombre d'articles el preu dels quals ¨¦s superior a 10.

Veieu tamb¨¦: Escapar de car¨¤cters especials dels valors de macro LLD a JSONPath.

Segments admesos

Segment ¶Ù±ð²õ³¦°ù¾±±è³¦¾±¨®
<nom> Concorda la propietat de l'objecte pel nom.
* Coincideix amb totes les propietats de l'objecte.
['<nom>'] Concorda la propietat de l'objecte pel nom.
['<nom>', '<nom>', ...] Fa coincidir la propietat de l'objecte amb un dels noms de la llista.
[<index>] Concorda element de matriu per ¨ªndex.
[<nombre>, <nombre>, ...] Fa coincidir l'element de la matriu amb un dels ¨ªndexs llistats.
[*] Coincideix amb totes les propietats de l'objecte o els elements de la matriu.
[<inici>:<fi>] Concorda els elements de la matriu segons l'interval definit:
<inici> - el primer ¨ªndex coincident (incl¨°s). Si no s'especifica, coincideix amb tots els elements de la matriu des del principi. Si ¨¦s negatiu, especifica el despla?ament inicial des del final de la matriu.
<fi> - el darrer ¨ªndex coincident (no incl¨°s). Si no s'especifica, coincideix amb tots els elements de la matriu fins al final. Si ¨¦s negatiu, especifica el despla?ament inicial des del final de la matriu.
[?(<expression>)] Concorda objectes/elements de matriu aplicant una expressi¨® de filtre.

Per trobar un segment coincident ignorant la seva ascend¨¨ncia (segment separat), ha d'anar prefixat amb dos punts ('..'). Per exemple, $..name o $..['name'] retornen els valors de totes les propietats name.

Els noms dels elements coincidents es poden extreure afegint un sufix barrat ~ al JSONPath. Retorna el nom de l'objecte corresponent o un ¨ªndex de cadena de l'element de matriu corresponent. El format de sortida segueix les mateixes regles que altres consultes JSONPath: els resultats del cam¨ª definit es retornen 'tal qual' i els resultats del cam¨ª no definit es retornen en una matriu. Tot i aix¨ª, no t¨¦ sentit extreure el nom d'un element corresponent a un cam¨ª definit: ja se sap.

Expressi¨® de filtre

L'expressi¨® de filtre ¨¦s una expressi¨® aritm¨¨tica en notaci¨® infix.

Operands admesos:

Operand ¶Ù±ð²õ³¦°ù¾±±è³¦¾±¨®
"<text>"
'<text>'
Constant de text.

Exemple:
'value: \\'1\\''
"value: '1'"
<nombre> Constante num¨¨rica que suporta la notaci¨® cient¨ªfica.

Exemple: 123
<jsonpath comen?a amb $> Valor al qual fa refer¨¨ncia JSONPath des del node arrel del document d'entrada; nom¨¦s s'admeten els camins definits.

Exemple: $.object.name
<jsonpath comen?a amb @> Valor referenciat pel JSONPath des de l'objecte/element actual; nom¨¦s s'admeten els camins definits.

Exemple: @.name

Operadors compatibles:

Operador Tipus ¶Ù±ð²õ³¦°ù¾±±è³¦¾±¨® Resultat
- binari Resta. Nombre.
+ binari Suma. Nombre.
/ binari ¶Ù¾±±¹¾±²õ¾±¨®. Nombre.
* binari ²Ñ³Ü±ô³Ù¾±±è±ô¾±³¦²¹³¦¾±¨®. Nombre.
== binari Igual. Boole¨¤ (1 o 0).
!= binari No ¨¦s igual a. Boole¨¤ (1 o 0).
< binari ?s inferior a. Boole¨¤ (1 o 0).
<= binari ?s menor o igual a. Boole¨¤ (1 o 0).
> binari ?s m¨¦s gran que. Boole¨¤ (1 o 0).
>= binari ?s m¨¦s gran o igual que. Boole¨¤ (1 o 0).
=~ binari Coincideix amb l'expressi¨® regular. Boole¨¤ (1 o 0).
! unitari No boole¨¤. Boole¨¤ (1 o 0).
|| binari O boole¨¤. Boole¨¤ (1 o 0).
&& binari I boole¨¤. Boole¨¤ (1 o 0).

Funcions

Les funcions es poden emprar al final d'un JSONPath. Es poden encadenar diverses funcions si la funci¨® anterior retorna un valor acceptat per la funci¨® seg¨¹ent.

Funcions admeses:

¹ó³Ü²Ô³¦¾±¨® ¶Ù±ð²õ³¦°ù¾±±è³¦¾±¨® Entrada Sortida
avg Valor mitj¨¤ dels nombres a una matriu d'entrada Matriu de nombres Nombre
min Valor m¨ªnim dels nombres a una matriu d'entrada Matriu de nombres Nombre
max Valor m¨¤xim dels nombres a una matriu d'entrada Matriu de nombres Nombre
sum Suma de nombres d'una matriu d'entrada Matriu de nombres Nombre
length Nombre d'elements a una matriu d'entrada. Matri. Nombre
first El primer element de la matriu Matriu Una construcci¨® JSON (objecte, matriu, valor) basada en el contingut de la matriu d'entrada

Els valors num¨¨rics entre cometes s¨®n admesos per les funcions agregades JSONPath. Aix¨° vol dir que els valors es converteixen del tipus de cadena a num¨¨ric si cal l'agregaci¨®. Una entrada incompatible far¨¤ que la funci¨® generi un error.

Valor de retorn

Els camins JSON es poden dividir en camins definits i no definits. Un cam¨ª definit nom¨¦s pot retornar una coincid¨¨ncia nul¡¤la o ¨²nica. Un cam¨ª no definit pot retornar diverses coincid¨¨ncies: JSONPaths amb diverses llistes de nom/¨ªndex, fragments de matriu o segments d'expressi¨® separats. Tanmateix, quan s'empra una funci¨®, el JSONPath s'estableix, ja que les funcions sempre generen un valor ¨²nic.

Un cam¨ª definit retorna l'objecte/matriu/valor al qual fa refer¨¨ncia. En canvi, el cam¨ª no definit retorna una matriu dels objectes/matrius/valors corresponents.

?s possible que l'ordre de la propietat dels resultats de la consulta JSONPath no s'alinei amb l'ordre de la propietat JSON original a causa dels m¨¨todes d'optimitzaci¨® interns. Per exemple, el JSONPath $.books[1]["author", "title"] pot retornar ["title", "author"]. Si conservar l'ordre de propietat original ¨¦s essencial, s'han de considerar m¨¨todes alternatius de processament posterior a la consulta.

Regles de format del cam¨ª

Els espais en blanc (espai, car¨¤cter de tabulaci¨®) es poden emprar en segments i expressions de notaci¨® de claud¨¤tors, per exemple: $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first ( ).

Les cadenes s'han de tancar amb cometes simples (') o dobles ("). Dins de les cadenes, les cometes simples o dobles (segons quines s'utilitzin per tancar-la) i les barres invertides (\) s'escapen amb el car¨¤cter de barra invertida (\).

Exemple

{
         "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 Tipus Resultat
$.filters.price definit 10
$.filters.category definit ´Ú¾±³¦³¦¾±¨®
$.filters['no filters'] definit no "filters"
$.filters definit {
"price": 10,
"category": "´Ú¾±³¦³¦¾±¨®",
"no filters": "no \"filters\""
}
$.books[1].title definit Sword of Honour
$.books[-1].author definit J. R. R. Tolkien
$.books.length() definit 4
$.tags[:] indefinit ["a", "b", "c", "d", "e" ]
$.tags[2:] indefinit ["c", "d", "e" ]
$.tags[:3] indefinit ["a", "b", "c"]
$.tags[1:4] indefinit ["b", "c", "d"]
$.tags[-2:] indefinit ["d", "e"]
$.tags[:-3] indefinit ["a", "b"]
$.tags[:-3].length() definit 2
$.books[0, 2].title indefinit ["Moby Dick", "Sayings of the Century"]
$.books[1]['author', "title"] indefinit ["Sword of Honour", "Evelyn Waugh"]
$..id indefinit [1, 2, 3, 4]
$.services..price indefinit [5, 154.99, 46, 24.5, 99.49]
$.books[?(@.id == 4 - 0.4 * 5)].title indefinit ["Sword of Honour"]

Nota: Aquesta cerca ensenya que les operacions aritm¨¨tiques es poden emprar a les consultes. Evidentment, aquesta consulta es pot simplificar com a $.books[?(@.id == 2)].title
$.books[?(@.id == 2 \|\| @.id == 4)].title indefinit ["Sword of Honour", "The Lord of the Rings"]
$.books[?(!(@.id == 2))].title indefinit ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"]
$.books[?(@.id != 2)].title indefinit ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"]
$.books[?(@.title =~ " of ")].title indefinit ["Sayings of the Century", "Sword of Honour", "The Lord of the Rings"]
$.books[?(@.price > 12.99)].title indefinit ["The Lord of the Rings"]
$.books[?(@.author > "Herman Melville")].title indefinit ["Sayings of the Century", "The Lord of the Rings"]
$.books[?(@.price > $.filters.price)].title indefinit ["Sword of Honour", "The Lord of the Rings"]
$.books[?(@.category == $.filters.category)].title indefinit ["Sword of Honour","Moby Dick","The Lord of the Rings"]
$.books[?(@.category == "´Ú¾±³¦³¦¾±¨®" && @.price < 10)].title indefinit ["Moby Dick"]
$..[?(@.id)] indefinit [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95,
"id": 1
},
{
"category": "´Ú¾±³¦³¦¾±¨®",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99,
"id": 2
},
{
"category": "´Ú¾±³¦³¦¾±¨®",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99,
"id": 3
},
{
"category": "´Ú¾±³¦³¦¾±¨®",
"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 indefinit '["Printing and assembling book in A5 format", "Rebinding torn book"]
$..id.length() definit 4
$.books[?(@.id == 2)].title.first() definit Sword of Honour
$..tags.first().length() definit 5

Nota: $..etiquetes ¨¦s un cam¨ª indefinit, pel que retornar¨¤ una matriu d'elements trobats, com ara [["a", "b", "c", "d", "e" ]]; first() retorna el primer element, com ara ["a", "b", "c", "d", "e" ]; length() calcula la seva allargada - 5.
$.books[*].price.min() definit 8.95
$..price.max() definit 154.99
$.books[?(@.category == "´Ú¾±³¦³¦¾±¨®")].price.avg() definit 14.99
$.books[?(@.category == $.filters.xyz)].title indefinit

Nota: Una consulta sense trobar res retornar¨¤ NULL per camins definits i indefinits.
$.services[?(@.active=="true")].servicegroup indefinit [1001,1000]

Nota: Les constants de text s'han d'emprar a les comparacions de valors booleans.
$.services[?(@.active=="false")].servicegroup indefinit [1002]

Nota: Les constants de text s'han d'emprar a les comparacions de valors booleans.
$.services[?(@.servicegroup=="1002")]~.first() definit °ù±ð²õ³Ù²¹³Ü°ù²¹³¦¾±¨®