Deze sectie geeft details weer van de ondersteunde JSONPath-functionaliteit in stappen voorafgaand aan de bewerking van itemwaarden.
JSONPath bestaat uit segmenten die gescheiden zijn door punten. Een segment kan ofwel een eenvoudig woord zijn, zoals een JSON-waardenaam, *
, of een complexere constructie die is ingesloten in vierkante haken [
]
. Het scheidingsteken punt voor een segment met haakjes is optioneel en kan worden weggelaten. Bijvoorbeeld:
Pad | Omschrijving |
---|---|
$.object.name |
Geef de inhoud van object.name terug. |
$.object['name'] |
Geef de inhoud van object.name terug. |
$.object.['name'] |
Geef de inhoud van object.name terug. |
$["object"]['name'] |
Geef de inhoud van object.name terug. |
$.['object'].["name"] |
Geef de inhoud van object.name terug. |
$.object.history.length() |
Geef het aantal elementen in de array object.history terug. |
$[?(@.name == 'Object')].price.first() |
Geef het prijsveld van het eerste object met de naam 'Object' terug. |
$[?(@.name == 'Object')].history.first().length() |
Geef het aantal elementen in de array history van het eerste object met de naam 'Object' terug. |
$[?(@.price > 10)].length() |
Geef het aantal objecten terug met een prijs hoger dan 10. |
Zie ook: Ontsnappen aan speciale tekens in LLD-macrowaarden in JSONPath.
Segment | Omschrijving |
---|---|
<naam> |
Match objecteigenschap op basis van naam. |
* |
Match alle objecteigenschappen. |
['<naam>'] |
Match objecteigenschap op basis van naam. |
['<naam>', '<naam>', ...] |
Match objecteigenschap op basis van een van de opgegeven namen. |
[<index>] |
Match array-element op basis van de index. |
[<getal>, <getal>, ...] |
Match array-element op basis van een van de opgegeven indexen. |
[*] |
Match alle objecteigenschappen of array-elementen. |
[<start>:<einde>] |
Match array-elementen op basis van het gedefinieerde bereik: <start> - de eerste index om overeen te komen (inclusief). Indien niet gespecificeerd, worden alle array-elementen vanaf het begin overeenkomend. Als negatief, specificeert het een start-offset vanaf het einde van de array. <einde> - de laatste index om overeen te komen (exclusief). Indien niet gespecificeerd, worden alle array-elementen overeenkomend tot het einde. Als negatief, specificeert het een start-offset vanaf het einde van de array. |
[?(<uitdrukking>)] |
Match objecten/array-elementen door een filteruitdrukking toe te passen. |
Om een overeenkomend segment te vinden en de hiërarchie te negeren (losgemaakt segment), moet het worden voorafgegaan door '..' , bijvoorbeeld $..name
of $..['name']
retourneert waarden van alle 'name' eigenschappen.
Overeenkomende elementnamen kunnen worden geëxtraheerd door een ~
-achtervoegsel toe te voegen aan de JSONPath. Het retourneert de naam van het overeenkomende object of een index in stringformaat van het overeenkomende array-item. De outputindeling volgt dezelfde regels als andere JSONPath-zoekopdrachten - definitieve padresultaten worden 'as is' geretourneerd en onbepaalde padresultaten worden in een array geretourneerd. Er is echter niet veel nut in het extraheren van de naam van een element dat overeenkomt met een definitief pad - dat is al bekend.
De filteruitdrukking is een rekenkundige expressie in infixnotatie.
Ondersteunde operanden:
Operand | Omschrijving | Voorbeeld |
---|---|---|
"<tekst>" '<tekst>' |
Tekstconstante. | 'waarde: \'1\'' "waarde: '1'" |
<getal> |
Numerieke constante met ondersteuning voor wetenschappelijke notatie. | 123 |
<jsonpad beginnend met $> |
Waarde waarnaar wordt verwezen door de JSONPath vanaf de root-node van het invoegdocument; alleen definitieve paden worden ondersteund. | $.object.name |
<jsonpad beginnend met @> |
Waarde waarnaar wordt verwezen door de JSONPath vanaf het huidige object/element; alleen definitieve paden worden ondersteund. | @.name |
Ondersteunde operatoren:
Operator | Type | Omschrijving | Resultaat |
---|---|---|---|
- |
binair | Aftrekking. | Getal. |
+ |
binair | Optelling. | Getal. |
/ |
binair | Deling. | Getal. |
* |
binair | Vermenigvuldiging. | Getal. |
== |
binair | Is gelijk aan. | Boolean (1 of 0). |
!= |
binair | Is niet gelijk aan. | Boolean (1 of 0). |
< |
binair | Is kleiner dan. | Boolean (1 of 0). |
<= |
binair | Is kleiner dan of gelijk aan. | Boolean (1 of 0). |
> |
binair | Is groter dan. | Boolean (1 of 0). |
>= |
binair | Is groter dan of gelijk aan. | Boolean (1 of 0). |
=~ |
binair | Komt overeen met reguliere expressie. | Boolean (1 of 0). |
! |
unaire | Logische negatie. | Boolean (1 of 0). |
|| |
binair | Logische OR. | Boolean (1 of 0). |
&& |
binair | Logische EN. | Boolean (1 of 0). |
Functies kunnen aan het einde van JSONPath worden gebruikt. Meerdere functies kunnen worden gekoppeld als de voorgaande functie een waarde retourneert die wordt geaccepteerd door de volgende functie.
Ondersteunde functies:
Functie | Beschrijving | Invoer | Uitvoer |
---|---|---|---|
avg |
Gemiddelde waarde van getallen in invoerarray. | Array van getallen. | Getal. |
min |
Minimale waarde van getallen in invoerarray. | Array van getallen. | Getal. |
max |
Maximale waarde van getallen in invoerarray. | Array van getallen. | Getal. |
sum |
Som van getallen in invoerarray. | Array van getallen. | Getal. |
length |
Aantal elementen in invoerarray. | Array. | Getal. |
first |
Het eerste element van de array. | Array. | Een JSON-constructie (object, array, waarde) afhankelijk van de inhoud van de invoerarray. |
Tussen aanhalingstekens geplaatste numerieke waarden worden geaccepteerd door de JSONPath-aggregatiefuncties. Dit betekent dat de waarden van het tekenreeptype naar numeriek worden geconverteerd als aggregatie vereist is.
Incompatibele invoer zal de functie een fout laten genereren.
JSON-paden kunnen worden verdeeld in definitieve en onbepaalde paden. Een definitief pad kan alleen null of een enkele overeenkomst retourneren. Een onbepaald pad kan meerdere overeenkomsten retourneren, in wezen JSON-paden met losgekoppelde, meerdere namen/indexlijst, array-slice of expressie-segmenten. Echter, wanneer een functie wordt gebruikt, wordt het JSON-pad definitief, omdat functies altijd een enkele waarde uitvoeren.
Een definitief pad retourneert het object/array/waarde waarnaar wordt verwezen, terwijl een onbepaald pad een array retourneert van de overeenkomende objecten/arrays/waarden.
De volgorde van eigenschappen in de resultaten van JSONPath-query's kan niet overeenkomen met de oorspronkelijke JSON-eigenschapsvolgorde vanwege interne optimalisatiemethoden. Bijvoorbeeld, het JSON-pad $.boeken[1]["auteur", "titel"]
kan [ "titel", "auteur"]
retourneren. Als het behouden van de oorspronkelijke eigenschapsvolgorde essentieel is, moeten alternatieve methoden voor het verwerken van de queryresultaten worden overwogen.
Witruimte (spaties, tabtekens) kan vrij worden gebruikt in segmenten van de vierkante haakjes-notatie en expressies, bijvoorbeeld, $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( )
.
{
"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 | Resultaat | Opmerkingen |
---|---|---|---|
$.filters.price |
definite | 10 | |
$.filters.category |
definite | fiction | |
$.filters['no filters'] |
definite | no "filters" | |
$.filters |
definite | { "price": 10, "category": "fiction", "no filters": "no \"filters\"" } |
|
$.books[1].title |
definite | Sword of Honour | |
$.books[-1].author |
definite | J. R. R. Tolkien | |
$.books.length() |
definite | 4 | |
$.tags[:] |
indefinite | ["a", "b", "c", "d", "e" ] | |
$.tags[2:] |
indefinite | ["c", "d", "e" ] | |
$.tags[:3] |
indefinite | ["a", "b", "c"] | |
$.tags[1:4] |
indefinite | ["b", "c", "d"] | |
$.tags[-2:] |
indefinite | ["d", "e"] | |
$.tags[:-3] |
indefinite | ["a", "b"] | |
$.tags[:-3].length() |
definite | 2 | |
$.books[0, 2].title |
indefinite | ["Moby Dick", "Sayings of the Century"] | |
$.books[1]['author', "title"] |
indefinite | ["Sword of Honour", "Evelyn Waugh"] | |
$..id |
indefinite | [1, 2, 3, 4] | |
$.services..price |
indefinite | [154.99, 5, 46, 24.5, 99.49] | |
$.books[?(@.id == 4 - 0.4 * 5)].title |
indefinite | ["Sword of Honour"] | Deze query laat zien dat wiskundige bewerkingen kunnen worden gebruikt in query's. Natuurlijk kan deze query worden vereenvoudigd tot $.books[?(@.id == 2)].title |
$.books[?(@.id == 2 \|\| @.id == 4)].title |
indefinite | ["Sword of Honour", "The Lord of the Rings"] | |
$.books[?(!(@.id == 2))].title |
indefinite | ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"] | |
$.books[?(@.id != 2)].title |
indefinite | ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"] | |
$.books[?(@.title =~ " of ")].title |
indefinite | ["Sayings of the Century", "Sword of Honour", "The Lord of the Rings"] | |
$.books[?(@.price > 12.99)].title |
indefinite | ["The Lord of the Rings"] | |
$.books[?(@.author > "Herman Melville")].title |
indefinite | ["Sayings of the Century", "The Lord of the Rings"] | |
$.books[?(@.price > $.filters.price)].title |
indefinite | ["Sword of Honour", "The Lord of the Rings"] | |
$.books[?(@.category == $.filters.category)].title |
indefinite | ["Sword of Honour","Moby Dick","The Lord of the Rings"] | |
$.books[?(@.category == "fiction" && @.price < 10)].title |
indefinite | ["Moby Dick"] | |
$..[?(@.id)] |
indefinite | [ { "price": 8.95, "id": 1, "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century" }, { "price": 12.99, "id": 2, "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour" }, { "price": 8.99, "id": 3, "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3" }, { "price": 22.99, "id": 4, "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8" } ] |
|
$.services..[?(@.price > 50)].description |
indefinite | '["Printing and assembling book in A5 format", "Rebinding torn book"] | |
$..id.length() |
definite | 4 | |
$.books[?(@.id == 2)].title.first() |
definite | Sword of Honour | |
$..tags.first().length() |
definite | 5 | $..tags is een onbepaald pad, dus het retourneert een array van overeenkomende elementen - [["a", "b", "c", "d", "e" ]], first() retourneert het eerste element - ["a", "b", "c", "d", "e" ] en ten slotte berekent length() de lengte ervan - 5. |
$.books[*].price.min() |
definite | 8.95 | |
$..price.max() |
definite | 154.99 | |
$.books[?(@.category == "fiction")].price.avg() |
definite | 14.99 | |
$.books[?(@.category == $.filters.xyz)].title |
indefinite | Een query zonder overeenkomst retourneert NULL voor zowel definitieve als onbepaalde paden. | |
$.services[?(@.active=="true")].servicegroup |
indefinite | [1001,1000] | Tekstconstanten moeten worden gebruikt in vergelijkingen van booleaanse waarden. |
$.services[?(@.active=="false")].servicegroup |
indefinite | [1002] | Tekstconstanten moeten worden gebruikt in vergelijkingen van booleaanse waarden. |
$.services[?(@.servicegroup=="1002")]~.first() |
definite | restoration |