Appendix B. Inspired by XPath (Inspiriert durch XPath)
Appendix B. Inspired by XPath (Inspiriert durch XPath)
Dieser Anhang ist informativ.
Zur Zeit der Erfindung von JSONPath war XML für leistungsfähige Werkzeuge zur Analyse, Transformation und selektiven Extraktion von Daten aus XML-Dokumenten bekannt. [XPath] ist eines dieser Werkzeuge.
2007 wurde der Bedarf nach etwas offenbar, das dieselbe Problemklasse für die wachsende JSON-Community löst, insbesondere für:
- interaktives Finden von Daten und Extrahieren aus JSON-Werten
[RFC8259] ohne spezielles Skripting und
- Angabe der relevanten Teile der JSON-Daten in einer Client-Anfrage, damit der Server die Datenmenge in der Antwort reduzieren und Bandbreite minimieren kann.
(Hinweis: XPath hat sich seit 2007 weiterentwickelt; neuere Versionen unterstützen nominell sogar die Arbeit innerhalb von JSON-Werten. Dieser Anhang behandelt nur die 2007 verbreiteter genutzte XPath-Version.)
JSONPath übernimmt das Gesamtgefühl von XPath, mappt die Konzepte jedoch auf Syntax (und teilweise Semantik), die jemandem vertraut ist, der JSON in einer dynamischen Sprache nutzt.
Beispielsweise können die Semantik des XPath-Ausdrucks:
/store/book[1]/title
in populären dynamischen Sprachen wie JavaScript, Python und PHP im Ausdruck umgesetzt werden:
x.store.book[0].title
oder in Klammernotation:
x['store']['book'][0]['title']
wobei die Variable x das Abfrageargument hält.
Die JSONPath-Sprache wurde entworfen, um:
-
natürlich auf diesen Spracheigenschaften zu basieren,
-
nur die wesentlichsten Teile von XPath 1.0 abzudecken,
-
in Codegröße und Speicherverbrauch leichtgewichtig zu sein und
-
zur Laufzeit effizient zu sein.
B.1. JSONPath and XPath (JSONPath und XPath)
JSONPath-Ausdrücke gelten für JSON-Werte analog zu XPath-Ausdrücken in Kombination mit einem XML-Dokument. JSONPath verwendet $, um den Wurzelknoten des Abfragearguments zu bezeichnen, ähnlich wie / am Anfang in XPath.
JSONPath-Ausdrücke gehen weiter in der Hierarchie mit Punktnotation ($.store.book[0].title) oder Klammernotation ($['store']['book'][0]['title']); beide ersetzen / in XPath-Ausdrücken, wobei Punktnotation leichtgewichtig aber eingeschränkt und Klammernotation schwerer aber allgemeiner ist.
Sowohl JSONPath als auch XPath verwenden * als Platzhalter. Die Nachfahren-Segment-Notation von JSONPath, beginnend mit .., entlehnt aus [E4X], ähnelt // in XPath. Das Array-Slice-Konstrukt [start:end:step] ist JSONPath-spezifisch, inspiriert von [SLICE] aus ECMASCRIPT 4.
Filterausdrücke werden über die Syntax ?<logical-expr> unterstützt, wie in:
$.store.book[[email protected] < 10].title
Tabelle 20 erweitert Tabelle 1 um einen Vergleich mit ähnlichen XPath-Konzepten.
| XPath | JSONPath | Description (Beschreibung) | |
|---|---|---|---|
| / | $ | das Wurzel-XML-Element | |
| . | @ | das aktuelle XML-Element | |
| / | . oder [] | Kind-Operator | |
| .. | n/a | Eltern-Operator | |
| // | ..name, | Nachfahren (JSONPath entlehnt | |
| ..[index], ..*, | diese Syntax aus E4X) | ||
| oder ..[*] | |||
| * | * | Platzhalter: alle XML-Elemente | |
| unabhängig vom Namen | |||
| @ | n/a | Attributzugriff: JSON-Werte haben | |
| keine Attribute | |||
| [] | [] | Indexoperator zur Iteration über | |
| XML-Elementkollektionen und für | |||
| Prädikate | |||
| [,] | Vereinigungsoperator (liefert | ||
| Kombination von Knotenmengen); in | |||
| JSONPath Listenoperator, erlaubt | |||
| Kombination von Mitgliedsnamen, | |||
| Array-Indizes und Slices | |||
| n/a | [start:end:step] | Array-Slice-Operator aus ES4 | |
| entlehnt | |||
| [] | ? | wendet einen Filter-(Skript-) | |
| Ausdruck an | |||
| seamless | n/a | Ausdrucks-Engine | |
| () | n/a | Gruppierung |
Tabelle 20: XPath-Syntax im Vergleich zu JSONPath
Zur weiteren Illustration zeigt Tabelle 21 einige XPath-Ausdrücke und ihre JSONPath-Äquivalente.
| XPath | JSONPath | Result (Ergebnis) |
|---|---|---|
| /store/book/author | $.store.book[*].author | die Autoren |
| aller Bücher | ||
| im Laden | ||
| //author | $..author | alle Autoren |
| /store/* | $.store.* | alle Dinge im |
| Laden, einige | ||
| Bücher und ein | ||
| rotes Fahrrad | ||
| /store//price | $.store..price | die Preise von |
| allem im Laden | ||
| //book[3] | $..book[2] | das dritte |
| Buch | ||
| //book[last()] | $..book[-1] | das letzte Buch |
| in der Reihenfolge | ||
| //book[position()<3] | $..book[0,1] | die ersten zwei |
| $..book[:2] | Bücher | |
| //book[isbn] | $..book[[email protected]] | alle Bücher mit |
| ISBN | ||
| //book[price<10] | $..book[[email protected]<10] | alle Bücher |
| günstiger als 10 | ||
| //* | $..* | alle Elemente |
| in einem XML- | ||
| Dokument; alle | ||
| Mitgliedswerte | ||
| und Array- | ||
| Elemente im | ||
| Eingabewert |
Tabelle 21: Beispiel-XPath-Ausdrücke und JSONPath-Äquivalente
XPath bietet deutlich mehr Funktionalität (Location Paths in unausgeführter Syntax, Operatoren und Funktionen) als in diesem Vergleich aufgeführt. Außerdem gibt es erhebliche Unterschiede, wie der Indexoperator in XPath und JSONPath arbeitet:
-
Eckige Klammern in XPath wirken stets auf die node set aus dem vorherigen Pfadfragment. Indizes beginnen stets bei 1.
-
Bei JSONPath wirken eckige Klammern auf jeden Knoten der Knotenliste aus dem vorherigen Abfragesegment. Array-Indizes beginnen stets bei 0.