Deze sectie geeft details over de ondersteunde JSONPath-functionaliteit in de stappen voor voorbewerking van itemwaarden.
JSONPath bestaat uit segmenten die worden gescheiden door punten. Een segment kan een eenvoudig woord zijn zoals een JSON-waardenaam, *
of een complexere constructie die wordt ingesloten in vierkante haken [
]
. Het scheidende punt vóór het hokje-segment is optioneel en kan worden weggelaten. Bijvoorbeeld:
Pad | Beschrijving |
---|---|
$.object.name |
Geeft de inhoud van object.name terug. |
$.object['name'] |
Geeft de inhoud van object.name terug. |
$.object.['name'] |
Geeft de inhoud van object.name terug. |
$["object"]['name'] |
Geeft de inhoud van object.name terug. |
$.['object'].["name"] |
Geeft de inhoud van object.name terug. |
$.object.history.length() |
Geeft het aantal elementen in de array object.history terug. |
$[?(@.name == 'Object')].price.first() |
Geeft het prijsveld van het eerste object met de naam 'Object' terug. |
$[?(@.name == 'Object')].history.first().length() |
Geeft het aantal elementen in de geschiedenisarray van het eerste object met de naam 'Object' terug. |
$[?(@.price > 10)].length() |
Geeft het aantal objecten terug waarvan de prijs groter is dan 10. |
Zie ook: Speciale tekens ontsnappen uit LLD-macrowaarden in JSONPath.
Segment | Beschrijving |
---|---|
<name> |
Overeenkomen met een objecteigenschap op naam. |
* |
Overeenkomen met alle objecteigenschappen. |
['<name>'] |
Overeenkomen met een objecteigenschap op naam. |
['<name>', '<name>', ...] |
Overeenkomen met een objecteigenschap op een van de opgegeven namen. |
[<index>] |
Overeenkomen met een array-element op basis van de index. |
[<number>, <number>, ...] |
Overeenkomen met een array-element op basis van een van de opgegeven indexes. |
[*] |
Overeenkomen met alle objecteigenschappen of array-elementen. |
[<start>:<end>] |
Overeenkomen met array-elementen op basis van het opgegeven bereik: <start> - de eerste index om overeen te komen (inbegrepen). Indien niet gespecificeerd, komen alle array-elementen vanaf het begin overeen. Indien negatief, geeft het een startverschuiving vanaf het einde van de array aan. <end> - de laatste index om overeen te komen (uitgesloten). Indien niet gespecificeerd, komen alle array-elementen overeen tot het einde. Indien negatief, geeft het een startverschuiving vanaf het einde van de array aan. |
[?(<expression>)] |
Overeenkomen met objecten/array-elementen door een filterexpressie toe te passen. |
Om een overeenkomend segment te vinden zonder rekening te houden met de hiërarchie ervan (losgekoppeld segment), moet het worden voorafgegaan door '..' , bijvoorbeeld $..name
of $..['name']
geeft waarden terug van alle 'name'-eigenschappen.
Overeenkomende elementnamen kunnen worden geëxtraheerd door een ~
achtervoegsel toe te voegen aan de JSONPath. Hiermee wordt de naam van het overeenkomende object of een index in stringformaat van het overeenkomende array-item geretourneerd. De uitvoerindeling volgt dezelfde regels als andere JSONPath-query's - definitieve padresultaten worden 'zoals ze zijn' geretourneerd en onbepaalde padresultaten worden als array geretourneerd. Er is echter weinig nut om de naam van een element dat overeenkomt met een definitief pad, te extraheren - deze is immers al bekend.
De filterexpressie is een arithmetische uitdrukking in infixnotatie.
Ondersteunde operanden:
Operand | Beschrijving | Voorbeeld |
---|---|---|
"<text>" '<text>' |
Tekstconstante. | 'value: \'1\'' "value: '1'" |
<number> |
Numerieke constante die wetenschappelijke notatie ondersteunt. | 123 |
<jsonpath die begint met $> |
Waarde waarnaar wordt verwezen door de JSONPath vanuit de wortelknoop van het invoegdocument; alleen definitieve paden worden ondersteund. | $.object.name |
<jsonpath die begint met @> |
Waarde waarnaar wordt verwezen door de JSONPath vanuit het huidige object/element; alleen definitieve paden worden ondersteund. | @.name |
Ondersteunde operatoren:
Operator | Type | Beschrijving | Resultaat |
---|---|---|---|
- |
binaire | Aftrekking. | Getal. |
+ |
binaire | Optelling. | Getal. |
/ |
binaire | Deling. | Getal. |
* |
binaire | Vermenigvuldiging. | Getal. |
== |
binaire | Is gelijk aan. | Boolean (1 of 0). |
!= |
binaire | Is niet gelijk aan. | Boolean (1 of 0). |
< |
binaire | Is kleiner dan. | Boolean (1 of 0). |
<= |
binaire | Is kleiner dan of gelijk aan. | Boolean (1 of 0). |
> |
binaire | Is groter dan. | Boolean (1 of 0). |
>= |
binaire | Is groter dan of gelijk aan. | Boolean (1 of 0). |
=~ |
binaire | Komt overeen met reguliere expressie. | Boolean (1 of 0). |
! |
unaire | Boolean not. | Boolean (1 of 0). |
|| |
binaire | Boolean or. | Boolean (1 of 0). |
&& |
binaire | Boolean and. | 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( )
.
Teksten moeten worden omsloten met enkele ' of dubbele " aanhalingstekens. Binnen de teksten worden enkele of dubbele aanhalingstekens (afhankelijk van welke worden gebruikt om het te omsluiten) en schuine strepen \
geëscaped met het schuine streep \
teken.
{
"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 | Result | 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 toont aan dat wiskundige operaties 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 tot slot berekent length() de lengte - 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] | Tekstconstantes moeten worden gebruikt in vergelijkingen met booleaanse waarden. |
$.services[?(@.active=="false")].servicegroup |
indefinite | [1002] | Tekstconstantes moeten worden gebruikt in vergelijkingen met booleaanse waarden. |
$.services[?(@.servicegroup=="1002")]~.first() |
definite | restoration |