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

2.5. Segments (セグメント)

2.5. Segments (セグメント)

入力ノードリストの各ノードに対し, セグメントはノードに1つ以上のセレクタを適用し, 各セレクタの結果を入力ノードごとのノードリストに連結し, それらを入力ノードリストの順に連結して単一のセグメント結果ノードリストを形成します.

クエリにセグメントが多いほど, 結果ノードリストのノードは入力値において深くなることがわかります:

  • セグメント数が N (N >= 0) のクエリは, 入力値において深さ N 以上のノードからなるノードリストを生成します.

  • セグメント数が N (N >= 0) で, すべてが child segment (第2.5.1節) であるクエリは, 入力値においてちょうど深さ N のノードからなるノードリストを生成します.

セグメントには child segment と descendant segment の2種類があります.

segment             = child-segment / descendant-segment

各種セグメントの構文と意味論を以下で定義します.

2.5.1 Child Segment (子セグメント)

2.5.1.1 Syntax (構文)

child segment は, 角括弧で囲まれた空でないカンマ区切りのセレクタ列からなります.

単一の wildcard または name selector の場合の省略記法も提供されます.

child-segment       = bracketed-selection /
("."
(wildcard-selector /
member-name-shorthand))

bracketed-selection = "[" S selector *(S "," S selector) S "]"

member-name-shorthand = name-first *name-char
name-first = ALPHA /
"_" /
%x80-D7FF /
; skip surrogate code points
%xE000-10FFFF
name-char = name-first / DIGIT
DIGIT               = %x30-39              ; 0-9
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z

.*, wildcard-selector から直接構築された child-segment は, [*] の省略形です.

.<member-name>, member-name-shorthand から構築された child-segment は, ['<member-name>'] の省略形です. 注: これは ABNF 規則 member-name-shorthand で指定される特定の文字のみからなるメンバ名でのみ使用できます. したがって例えば $.foo.bar$['foo']['bar'] の省略形ですが $['foo.bar'] の省略形ではありません.

2.5.1.2 Semantics (意味論)

child segment はセレクタの列を含み, 各セレクタは入力値のゼロ個以上の子を選択します.

異なる種類のセレクタを単一の child segment 内で組み合わせられます.

入力ノードリストの各ノードに対し, child segment の結果ノードリストは, リスト内の順に各セレクタからのノードリストの連結です. 注: 複数のセレクタに一致したノードは, ノードリストにその回数だけ残ります.

セレクタが複数の順序でノードリストを生成しうる場合, child segment 内のセレクタの各出現は異なる順序のノードリストを生成しうります.

要約すると, child segment は入力値の構造にもう1レベル深く入ります.

2.5.1.3 Examples (例)

JSON:

["a", "b", "c", "d", "e", "f", "g"]

Queries:

QueryResultResultComment
Paths
$[0,"a"$[0]Indices
3]"d"$[3]
$[0:2,"a"$[0]Slice and
5]"b"$[1]index
"f"$[5]
$[0,"a"$[0]Duplicated
0]"a"$[0]entries

表15: Child Segment の例

2.5.2 Descendant Segment (子孫セグメント)

2.5.2.1 Syntax (構文)

descendant segment は二重ドット .. の後に child segment (bracket notation を用いる) が続きます.

child segment の省略形に対応する省略記法も提供されます.

descendant-segment  = ".." (bracketed-selection /
wildcard-selector /
member-name-shorthand)

..*, wildcard-selector から直接構築された descendant-segment は, ..[*] の省略形です.

..<member-name>, member-name-shorthand から構築された descendant-segment は, ..['<member-name>'] の省略形です. 注: child-segment の同様の省略と同様, member-name-shorthand 規則で指定される文字のみからなるメンバ名でのみ使用できます.

注: 単独の .. は妥当なセグメントではありません.

2.5.2.2 Semantics (意味論)

descendant segment は入力値のゼロ個以上の子孫を生成します.

入力ノードリストの各ノードに対し, descendant selector は入力ノードとその各子孫を次のように訪問します:

  • 任意の配列のノードは配列順で訪問され,

  • ノードはその子孫より前に訪問されます.

オブジェクトの子の訪問順は規定しません. JSON オブジェクトは順序を持たないためです.

descendant segment が (任意の省略形を bracket notation に変換した後) ..[<selectors>] の形であり, 訪問順のノードが D1, ..., Dn (n >= 1) であるとします. 注: D1 は入力値です.

各 i について 1 <= i <= n, ノードリスト Ri を child segment [<selectors>] をノード Di に適用した結果と定義します.

入力ノードリストの各ノードに対し, descendant segment の結果は R1, ..., Rn の連結 (この順) です. これらの結果は入力ノードリストの順に連結されセグメントの結果となります.

要約すると, descendant segment は各入力値の構造に1レベル以上深く入ります.

2.5.2.3 Examples (例)

JSON:

{
"o": {"j": 1, "k": 2},
"a": [5, 3, [{"j": 4}, {"k": 6}]]
}

Queries:

(第4例は等価な2つのクエリで表せます. 表16ではほぼ同一の2行ではなく1行に示します.)

QueryResultResult PathsComment
$..j1$['o']['j']Object values
4$['a'][2][0]['j']
$..j4$['a'][2][0]['j']Alternative
1$['o']['j']result
$..[0]5$['a'][0]Array values
{"j": 4}$['a'][2][0]
$..[*]{"j": 1,$['o']All values
or"k": 2}$['a']
$..*[5, 3,$['o']['j']
[{"j": 4},$['o']['k']
{"k": 6}]]$['a'][0]
1$['a'][1]
2$['a'][2]
5$['a'][2][0]
3$['a'][2][1]
[{"j": 4},$['a'][2][0]['j']
{"k": 6}]$['a'][2][1]['k']
{"j": 4}
{"k": 6}
4
6
$..o{"j": 1,$['o']Input value is
"k": 2}visited
$.o..[*,1$['o']['j']Non-deterministic
*]2$['o']['k']ordering
2$['o']['k']
1$['o']['j']
$.a..[0,5$['a'][0]Multiple segments
1]3$['a'][1]
{"j": 4}$['a'][2][0]
{"k": 6}$['a'][2][1]

表16: Descendant Segment の例

注: 上の $..[*]$..* の例の結果の順序は保証されません. ただし次は必須です:

  • {"j": 1, "k": 2} は 1 と 2 より前に現れなければならない,

  • [5, 3, [{"j": 4}, {"k": 6}]] は 5, 3, [{"j": 4}, {"k": 6}] より前に現れなければならない,

  • 5 は 3 より前, 3 は [{"j": 4}, {"k": 6}] より前に現れなければならない,

  • 5 と 3 は {"j": 4}, 4, {"k": 6}, 6 より前に現れなければならない,

  • [{"j": 4}, {"k": 6}]{"j": 4}{"k": 6} より前に現れなければならない,

  • {"j": 4}{"k": 6} より前に現れなければならない,

  • {"k": 6} は 4 より前に現れなければならない,

  • 4 は 6 より前に現れなければならない.

上のクエリ $.o..[*, *] の例は, descendant segment 内でセレクタが現れるたびに異なる順序のノードリストを生成しうることを示します.

上のクエリ $.a..[0, 1] の例は, child segment [0, 1] が各ノードに順に適用されること (セレクタごとに一度だけノードを訪問する一部の JSONPath 実装とは異なる) を示します. 後者は本仕様に適合しません.