Zum Hauptinhalt springen

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.

XPathJSONPathDescription (Beschreibung)
/$das Wurzel-XML-Element
.@das aktuelle XML-Element
/. oder []Kind-Operator
..n/aEltern-Operator
//..name,Nachfahren (JSONPath entlehnt
..[index], ..*,diese Syntax aus E4X)
oder ..[*]
**Platzhalter: alle XML-Elemente
unabhängig vom Namen
@n/aAttributzugriff: 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
seamlessn/aAusdrucks-Engine
()n/aGruppierung

Tabelle 20: XPath-Syntax im Vergleich zu JSONPath

Zur weiteren Illustration zeigt Tabelle 21 einige XPath-Ausdrücke und ihre JSONPath-Äquivalente.

XPathJSONPathResult (Ergebnis)
/store/book/author$.store.book[*].authordie Autoren
aller Bücher
im Laden
//author$..authoralle Autoren
/store/*$.store.*alle Dinge im
Laden, einige
Bücher und ein
rotes Fahrrad
/store//price$.store..pricedie 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.