4 JSONPath-Funktionalität
Übersicht
Dieser Abschnitt beschreibt die unterstützte JSONPath-Funktionalität innerhalb der Vorverarbeitungsschritte von Datenpunkt-Werten.
JSONPath besteht aus Segmenten, die durch Punkte getrennt sind.
Ein Segment kann die Form eines einfachen Wortes annehmen, das einen JSON-Wertnamen darstellt, des Platzhalterzeichens (*) oder eines komplexeren Konstrukts in eckigen Klammern.
Der Punkt vor einem in Klammern gesetzten Segment ist optional und kann weggelassen werden.
| JSONPath example | Description |
|---|---|
$.object.name |
Gibt den Inhalt von object.name zurück. |
$.object['name'] |
Gibt den Inhalt von object.name zurück. |
$.object.['name'] |
Gibt den Inhalt von object.name zurück. |
$["object"]['name'] |
Gibt den Inhalt von object.name zurück. |
$.['object'].["name"] |
Gibt den Inhalt von object.name zurück. |
$.object.history.length() |
Gibt die Anzahl der Array-Elemente in object.history zurück. |
$[?(@.name == 'Object')].price.first() |
Gibt den Wert der Eigenschaft price aus dem ersten Objekt mit dem Namen „Object“ zurück. |
$[?(@.name == 'Object')].history.first().length() |
Gibt die Anzahl der History-Array-Elemente aus dem ersten Objekt mit dem Namen „Object“ zurück. |
$[?(@.price > 10)].length() |
Gibt die Anzahl der Objekte mit einem Preis größer als 10 zurück. |
Siehe auch: Escaping special characters from LLD macro values in JSONPath.
Unterstützte Segmente
| Segment | Beschreibung |
|---|---|
<name> |
Objekteigenschaft anhand des Namens abgleichen. |
* |
Alle Objekteigenschaften abgleichen. |
['<name>'] |
Objekteigenschaft anhand des Namens abgleichen. |
['<name>', '<name>', ...] |
Objekteigenschaft anhand eines der aufgeführten Namen abgleichen. |
[<index>] |
Array-Element anhand des Index abgleichen. |
[<number>, <number>, ...] |
Array-Element anhand eines der aufgeführten Indizes abgleichen. |
[*] |
Alle Objekteigenschaften oder Array-Elemente abgleichen. |
[<start>:<end>] |
Array-Elemente anhand des definierten Bereichs abgleichen: <start> - der erste abzugleichende Index (einschließlich); wenn nicht angegeben, werden alle Array-Elemente ab dem Anfang abgeglichen; wenn negativ, wird der Startversatz vom Ende des Arrays angegeben; <end> - der letzte abzugleichende Index (ausschließlich); wenn nicht angegeben, werden alle Array-Elemente bis zum Ende abgeglichen; wenn negativ, wird der Startversatz vom Ende des Arrays angegeben. |
[?(<expression>)] |
Objekte/Array-Elemente durch Anwenden eines Filterausdrucks abgleichen. |
Um ein passendes Segment unabhängig von seiner Herkunft zu finden (detached segment), muss ihm mit zwei Punkten (..) vorangestellt werden.
Zum Beispiel geben $..name oder $..['name'] die Werte aller name-Eigenschaften zurück.
Namen abgeglichener Elemente können extrahiert werden, indem dem JSONPath ein Tilde-Suffix (~) hinzugefügt wird.
Dabei wird der Name des abgeglichenen Objekts oder ein Index des abgeglichenen Array-Elements im Zeichenfolgenformat zurückgegeben.
Das Ausgabeformat folgt denselben Regeln wie bei anderen JSONPath-Abfragen – Ergebnisse eines definitiven Pfads werden unverändert zurückgegeben, und Ergebnisse eines nicht definitiven Pfads werden in einem Array zurückgegeben.
Allerdings hat das Extrahieren des Namens eines Elements, das einem definitiven Pfad entspricht, nur einen geringen Nutzen, da dieser bereits bekannt ist.
Filterausdruck
Der Filterausdruck ist ein arithmetischer Ausdruck in Infixnotation.
Unterstützte Operanden:
| Operand | Beschreibung |
|---|---|
"<text>"'<text>' |
Textkonstante. Beispiel: 'value: \\'1\\''"value: '1'" |
<number> |
Numerische Konstante mit Unterstützung für wissenschaftliche Notation. Beispiel: 123 |
<jsonpath starting with $> |
Wert, auf den über den JSONPath vom Wurzelknoten des Eingabedokuments verwiesen wird; nur eindeutige Pfade werden unterstützt. Beispiel: $.object.name |
<jsonpath starting with @> |
Wert, auf den über den JSONPath vom aktuellen Objekt/Element verwiesen wird; nur eindeutige Pfade werden unterstützt. Beispiel: @.name |
Unterstützte Operatoren:
| Operator | Typ | Beschreibung | Ergebnis |
|---|---|---|---|
- |
Binär | Subtraktion | Zahl |
+ |
Binär | Addition | Zahl |
/ |
Binär | Division | Zahl |
* |
Binär | Multiplikation | Zahl |
== |
Binär | Gleichheit | Boolesch (1/0) |
!= |
Binär | Ungleichheit | Boolesch (1/0) |
< |
Binär | Kleiner als | Boolesch (1/0) |
<= |
Binär | Kleiner oder gleich | Boolesch (1/0) |
> |
Binär | Größer als | Boolesch (1/0) |
>= |
Binär | Größer oder gleich | Boolesch (1/0) |
=~ |
Binär | Entspricht regulärem Ausdruck | Boolesch (1/0) |
! |
Unär | Boolesches NICHT | Boolesch (1/0) |
|| |
Binär | Boolesches ODER | Boolesch (1/0) |
&& |
Binär | Boolesches UND | Boolesch (1/0) |
Funktionen
Funktionen können am Ende von JSONPath verwendet werden. Mehrere Funktionen können verkettet werden, wenn die vorhergehende Funktion einen Wert zurückgibt, der von der nachfolgenden Funktion akzeptiert wird.
Unterstützte Funktionen:
| Funktion | Beschreibung | Eingabe | Ausgabe |
|---|---|---|---|
avg |
Durchschnittswert der Zahlen in einem Eingabe-Array | Array von Zahlen | Zahl |
min |
Minimalwert der Zahlen in einem Eingabe-Array | Array von Zahlen | Zahl |
max |
Maximalwert der Zahlen in einem Eingabe-Array | Array von Zahlen | Zahl |
sum |
Summe der Zahlen in einem Eingabe-Array | Array von Zahlen | Zahl |
length |
Anzahl der Elemente in einem Eingabe-Array | Array | Zahl |
first |
Das erste Element eines Arrays | Array | Ein JSON-Konstrukt (Objekt, Array, Wert) abhängig vom Inhalt des Eingabe-Arrays |
JSONPath-Aggregatfunktionen akzeptieren numerische Werte in Anführungszeichen. Diese Werte werden automatisch von Zeichenfolgen in numerische Typen umgewandelt, wenn eine Aggregation erforderlich ist. Nicht kompatible Eingaben führen dazu, dass die Funktion einen Fehler erzeugt.
Ausgabewert
JSONPaths können in bestimmte und unbestimmte Pfade unterteilt werden. Ein bestimmter Pfad kann nur null oder eine einzelne Übereinstimmung zurückgeben. Ein unbestimmter Pfad kann mehrere Übereinstimmungen zurückgeben: JSONPaths mit losgelösten Segmenten, mehreren Namens-/Indexlisten, Array-Slices oder Ausdruckssegmenten. Wird jedoch eine Funktion verwendet, wird der JSONPath zu einem bestimmten Pfad, da Funktionen immer einen einzelnen Wert ausgeben.
Ein bestimmter Pfad gibt das Objekt/Array/den Wert zurück, auf das/den er verweist. Im Gegensatz dazu gibt ein unbestimmter Pfad ein Array der übereinstimmenden Objekte/Arrays/Werte zurück.
Die Reihenfolge der Eigenschaften in JSONPath-Abfrageergebnissen stimmt aufgrund interner Optimierungsmethoden möglicherweise nicht mit der ursprünglichen Reihenfolge der JSON-Eigenschaften überein.
Beispielsweise kann der JSONPath $.books[1]["author", "title"] ["title", "author"] zurückgeben.
Wenn die Beibehaltung der ursprünglichen Reihenfolge der Eigenschaften wesentlich ist, sollten alternative Methoden zur Nachbearbeitung nach der Abfrage in Betracht gezogen werden.
Regeln für die Pfadformatierung
Leerzeichen (Leerzeichen, Tabulatorzeichen) können in Segmenten und Ausdrücken der Klammernotation verwendet werden, zum Beispiel: $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( ).
Zeichenfolgen sollten in einfache (') oder doppelte (") Anführungszeichen gesetzt werden.
Innerhalb der Zeichenfolgen werden einfache oder doppelte Anführungszeichen (je nachdem, welche zum Einschließen verwendet werden) und Backslashes (\) mit dem Backslash-Zeichen (\) maskiert.
Beispiel
{
"books": [
{
"category": "Referenz",
"author": "Nigel Rees",
"title": "Sprüche des Jahrhunderts",
"price": 8.95,
"id": 1
},
{
"category": "Belletristik",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99,
"id": 2
},
{
"category": "Belletristik",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99,
"id": 3
},
{
"category": "Belletristik",
"author": "J. R. R. Tolkien",
"title": "Der Herr der Ringe",
"isbn": "0-395-19395-8",
"price": 22.99,
"id": 4
}
],
"services": {
"delivery": {
"servicegroup": 1000,
"description": "Lieferung am nächsten Tag in der Stadt",
"active": true,
"price": 5
},
"bookbinding": {
"servicegroup": 1001,
"description": "Drucken und Zusammenstellen eines Buches im A5-Format",
"active": true,
"price": 154.99
},
"restoration": {
"servicegroup": 1002,
"description": "Verschiedene Restaurierungsmethoden",
"active": false,
"methods": [
{
"description": "Chemische Reinigung",
"price": 46
},
{
"description": "Pressen von durch Feuchtigkeit beschädigten Seiten",
"price": 24.5
},
{
"description": "Neubinden eines zerrissenen Buches",
"price": 99.49
}
]
}
},
"filters": {
"price": 10,
"category": "Belletristik",
"no filters": "keine \"Filter\""
},
"closed message": "Geschäft ist geschlossen",
"tags": [
"a",
"b",
"c",
"d",
"e"
]
}
| JSONPath | Type | Result |
|---|---|---|
$.filters.price |
definite | 10 |
$.filters.category |
definite | Belletristik |
$.filters['no filters'] |
definite | keine "Filter" |
$.filters |
definite | { "price": 10, "category": "Belletristik", "no filters": "keine \"Filter\"" } |
$.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", "Sprüche des Jahrhunderts"] |
$.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"] Hinweis: Diese Abfrage zeigt, dass arithmetische Operationen in Abfragen verwendet werden können; sie kann zu $.books[?(@.id == 2)].title vereinfacht werden. |
$.books[?(@.id == 2 \|\| @.id == 4)].title |
indefinite | ["Sword of Honour", "Der Herr der Ringe"] |
$.books[?(!(@.id == 2))].title |
indefinite | ["Sprüche des Jahrhunderts", "Moby Dick", "Der Herr der Ringe"] |
$.books[?(@.id != 2)].title |
indefinite | ["Sprüche des Jahrhunderts", "Moby Dick", "Der Herr der Ringe"] |
$.books[?(@.title =~ " of ")].title |
indefinite | ["Sprüche des Jahrhunderts", "Sword of Honour", "Der Herr der Ringe"] |
$.books[?(@.price > 12.99)].title |
indefinite | ["Der Herr der Ringe"] |
$.books[?(@.author > "Herman Melville")].title |
indefinite | ["Sprüche des Jahrhunderts", "Der Herr der Ringe"] |
$.books[?(@.price > $.filters.price)].title |
indefinite | ["Sword of Honour", "Der Herr der Ringe"] |
$.books[?(@.category == $.filters.category)].title |
indefinite | ["Sword of Honour","Moby Dick","Der Herr der Ringe"] |
$.books[?(@.category == "fiction" && @.price < 10)].title |
indefinite | ["Moby Dick"] |
$..[?(@.id)] |
indefinite | [ { "price": 8.95, "id": 1, "category": "Referenz", "author": "Nigel Rees", "title": "Sprüche des Jahrhunderts" }, { "price": 12.99, "id": 2, "category": "Belletristik", "author": "Evelyn Waugh", "title": "Sword of Honour" }, { "price": 8.99, "id": 3, "category": "Belletristik", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3" }, { "price": 22.99, "id": 4, "category": "Belletristik", "author": "J. R. R. Tolkien", "title": "Der Herr der Ringe", "isbn": "0-395-19395-8" } ] |
$.services..[?(@.price > 50)].description |
indefinite | ["Drucken und Zusammenstellen eines Buches im A5-Format", "Neubinden eines zerrissenen Buches"] |
$..id.length() |
definite | 4 |
$.books[?(@.id == 2)].title.first() |
definite | Sword of Honour |
$..tags.first().length() |
definite | 5 Hinweis: $..tags ist ein unbestimmter Pfad, daher gibt er ein Array der übereinstimmenden Elemente zurück, d. h. [["a", "b", "c", "d", "e" ]]; first() gibt das erste Element zurück, d. h. ["a", "b", "c", "d", "e"]; length() berechnet die Länge des Elements, d. h. 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 | Hinweis: Eine Abfrage ohne Treffer gibt für bestimmte und unbestimmte Pfade NULL zurück. |
$.services[?(@.active=="true")].servicegroup |
indefinite | [1001,1000] Hinweis: Bei Vergleichen mit booleschen Werten müssen Textkonstanten verwendet werden. |
$.services[?(@.active=="false")].servicegroup |
indefinite | [1002] Hinweis: Bei Vergleichen mit booleschen Werten müssen Textkonstanten verwendet werden. |
$.services[?(@.servicegroup=="1002")]~.first() |
definite | restoration |