メインコンテンツまでスキップ

2.7. Normalized Paths (正規化パス)

2.7. Normalized Paths (正規化パス)

Normalized Path (正規化パス) は, 値内のノードの位置の一意表現であり, 値内でそのノードを一意に識別します. 具体的には Normalized Path は制限された構文 (以下で定義) の JSONPath クエリです, 例: $['book'][3], 値に適用すると正規化パスで識別されるノードのみからなるノードリストが得られます. 注: Normalized Path は 特定の値における ノードの同一性を表します. 値内の任意の特定ノードを識別する Normalized Path はちょうど1つ存在します.

ノードリストは JSON 内で文字列の配列としてコンパクトに表現でき, 文字列は Normalized Path です.

Normalized Path は予測可能な形式を提供し, ノードリストのテストや後処理 (例: 重複ノードの除去) を簡素化します. 本ドキュメントでは例の result path として Normalized Path を用います.

Normalized Path は省略 dot notation ではなく正規の bracket notation を用います.

Normalized Path では文字列メンバ名の区切りに single quote を用います. これにより Normalized Path が double quote で区切られた文字列内に現れる際にエスケープが必要な文字数を減らします (例: JSON テキスト内).

特定の文字は Normalized Path では1通りにのみエスケープされ, それ以外の文字はエスケープされません.

注: Normalized Path は singular query (単一クエリ) ですが,
すべての単一クエリが Normalized Path とは限りません. 例えば $[-3] は
単一クエリですが Normalized Path ではありません. $[-3] に相当する
Normalized Path ではインデックスは配列長から3を引いた値になります.
($[-3] がノードを識別するには配列長は少なくとも3でなければなりません.)
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

与えられたノードを識別できる Normalized Path は1つに限られるため, 構文はどの文字をエスケープするかを規定します. したがって normal-hexchar の定義は, 例えば U+000B LINE TABULATION のように直接的に印字しにくい文字を16進エスケープするためのものですが, \n のような標準 JSON エスケープがない場合向けです.

2.7.1 Examples (例)

PathNormalized PathComment
$.a$['a']Object value
$[1]$[1]Array index
$[-3]$[2]長さ5の配列に対する
負の配列インデックス
$.a.b[1:2]$['a']['b'][1]ネストした構造
$["\u000B"]$['\u000b']Unicode escape
$["\u0061"]$['a']Unicode character

表18: Normalized Path の例