Zum Hauptinhalt springen

2.7. Normalized Paths (Normalisierte Pfade)

2.7. Normalized Paths (Normalisierte Pfade)

Ein Normalized Path (normalisierter Pfad) ist eine eindeutige Darstellung der Position eines Knotens in einem Wert, die den Knoten im Wert eindeutig identifiziert. Konkret ist ein Normalized Path eine JSONPath-Abfrage mit eingeschränkter Syntax (unten definiert), z. B. $['book'][3], die, auf den Wert angewendet, eine Knotenliste ergibt, die nur den durch den Normalized Path identifizierten Knoten enthält. Hinweis: Ein Normalized Path repräsentiert die Identität eines Knotens in einem bestimmten Wert. Es gibt genau einen Normalized Path, der einen bestimmten Knoten in einem Wert identifiziert.

Eine Knotenliste kann kompakt in JSON als Array von Zeichenketten dargestellt werden, wobei die Zeichenketten Normalized Paths sind.

Normalized Paths bieten ein vorhersagbares Format, das Tests und Nachverarbeitung von Knotenlisten vereinfacht, z. B. zum Entfernen doppelter Knoten. In diesem Dokument werden Normalized Paths als Ergebnispfade in Beispielen verwendet.

Normalized Paths nutzen die kanonische Klammernotation statt Punktnotation.

In Normalized Paths werden einfache Anführungszeichen zur Begrenzung von Zeichenketten-Mitgliedsnamen verwendet. Das reduziert die Anzahl der Zeichen, die escaped werden müssen, wenn Normalized Paths in von doppelten Anführungszeichen begrenzten Zeichenketten erscheinen, z. B. in JSON-Texten.

Bestimmte Zeichen werden in Normalized Paths auf genau eine Weise escaped; alle anderen Zeichen sind unescaped.

Hinweis: Normalized Paths sind singuläre Abfragen, aber nicht alle
singulären Abfragen sind Normalized Paths. Beispielsweise ist
$[-3] eine singuläre Abfrage, aber kein Normalized Path. Der
Normalized Path äquivalent zu $[-3] hätte einen Index gleich
Arraylänge minus 3. (Die Arraylänge muss mindestens 3 sein, wenn
$[-3] einen Knoten identifizieren soll.)
normalized-path      = root-identifier *(normal-index-segment)
normal-index-segment = "[" normal-selector "]"
normal-selector = normal-name-selector / normal-index-selector
normal-name-selector = %x27 *normal-single-quoted %x27 ; 'string'
normal-single-quoted = normal-unescaped /
ESC normal-escapable
normal-unescaped = ; omit %x0-1F control codes
%x20-26 /
; omit 0x27 '
%x28-5B /
; omit 0x5C \
%x5D-D7FF /
; skip surrogate code points
%xE000-10FFFF
normal-escapable     = %x62 / ; b BS backspace U+0008
%x66 / ; f FF form feed U+000C
%x6E / ; n LF line feed U+000A
%x72 / ; r CR carriage return U+000D
%x74 / ; t HT horizontal tab U+0009
"'" / ; ' apostrophe U+0027
"\" / ; \ backslash (reverse solidus) U+005C
(%x75 normal-hexchar)
; certain values u00xx U+00XX
normal-hexchar = "0" "0"
(
("0" %x30-37) / ; "00"-"07"
; omit U+0008-U+000A BS HT LF
("0" %x62) / ; "0b"
; omit U+000C-U+000D FF CR
("0" %x65-66) / ; "0e"-"0f"
("1" normal-HEXDIG)
)
normal-HEXDIG = DIGIT / %x61-66 ; "0"-"9", "a"-"f"
normal-index-selector = "0" / (DIGIT1 *DIGIT)
; non-negative decimal integer

Da es nur einen Normalized Path geben kann, der einen gegebenen Knoten identifiziert, schreibt die Syntax vor, welche Zeichen escaped werden und welche nicht. Die Definition von normal-hexchar dient dem hexadezimalen Escapen von Zeichen, die nicht unkompliziert druckbar sind, z. B. U+000B LINE TABULATION, für die kein Standard-JSON-Escape wie \n existiert.

2.7.1. Examples (Beispiele)

PathNormalized PathComment
$.a$['a']Objektwert
$[1]$[1]Array-Index
$[-3]$[2]Negativer Array-Index für
ein Array der Länge 5
$.a.b[1:2]$['a']['b'][1]Verschachtelte Struktur
$["\u000B"]$['\u000b']Unicode-Escape
$["\u0061"]$['a']Unicode-Zeichen

Tabelle 18: Beispiele Normalized Paths