2.3. Selectors (セレクタ)
2.3. Selectors (セレクタ)
セレクタは child segment (第2.5.1節) と descendant segment (第2.5.2節) の内部にのみ現れます.
セレクタは入力値のゼロ個以上の子からなるノードリストを生成します.
オブジェクトの子, 配列の子, またはオブジェクトと配列のいずれかの子を生成するさまざまな種類のセレクタがあります.
selector = name-selector /
wildcard-selector /
slice-selector /
index-selector /
filter-selector
各種セレクタの構文と意味論を以下で定義します.
2.3.1 Name Selector (名前セレクタ)
2.3.1.1 Syntax (構文)
name selector '<name>' は高々1つのオブジェクトメンバ値を選択します.
JSON とは対照的に, JSONPath 構文では文字列を single (単一) または double (二重) の引用符で囲めます.
name-selector = string-literal
string-literal = %x22 *double-quoted %x22 / ; "string"
%x27 *single-quoted %x27 ; 'string'
double-quoted = unescaped /
%x27 / ; '
ESC %x22 / ; \"
ESC escapable
single-quoted = unescaped /
%x22 / ; "
ESC %x27 / ; \'
ESC escapable
ESC = %x5C ; \ backslash
unescaped = %x20-21 / ; see RFC 8259
; omit 0x22 "
%x23-26 /
; omit 0x27 '
%x28-5B /
; omit 0x5C \
%x5D-D7FF /
; skip surrogate code points
%xE000-10FFFF
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
"/" / ; / slash (solidus) U+002F
"\" / ; \ backslash (reverse solidus) U+005C
(%x75 hexchar) ; uXXXX U+XXXX
hexchar = non-surrogate /
(high-surrogate "\" %x75 low-surrogate)
non-surrogate = ((DIGIT / "A"/"B"/"C" / "E"/"F") 3HEXDIG) /
("D" %x30-37 2HEXDIG )
high-surrogate = "D" ("8"/"9"/"A"/"B") 2HEXDIG
low-surrogate = "D" ("C"/"D"/"E"/"F") 2HEXDIG
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
注:
-
Double-quoted strings (二重引用符文字列) は JSON の文字列構文 ([RFC8259] 第7節) に従い, single-quoted strings (単一引用符文字列) はこれに類似したパターンに従います. 本構文を改良する試みは行われていないため, 0xFFFF を超えるスカラー値を持つ文字 (例: U+1F041 ("🁁", DOMINO TILE HORIZONTAL-02-02)) をエスケープするには, サロゲートエスケープの対 (本例では "\uD83C\uDC41") で表現する必要があります.
-
引用符付き文字列内の英字は ABNF では大文字小文字を区別しません. したがって hexchar が参照する規則で指定される
\uエスケープ内の16進数字はそれぞれ小文字でも大文字でもよく,\uの u は小文字でなければなりません (%x75 で示される).
2.3.1.2 Semantics (意味論)
name-selector 文字列は, 囲み引用符を除去し各エスケープ列を表4に示す等価 Unicode 文字に置換することでメンバ名 M に変換しなければなりません (MUST):
| Escape Sequence | Unicode Character | Description (説明) |
|---|---|---|
| \b | U+0008 | BS backspace |
| \t | U+0009 | HT horizontal tab |
| \n | U+000A | LF line feed |
| \f | U+000C | FF form feed |
| \r | U+000D | CR carriage return |
| " | U+0022 | quotation mark |
| ' | U+0027 | apostrophe |
| / | U+002F | slash (solidus) |
| \ | U+005C | backslash (reverse |
| solidus) | ||
| \uXXXX | see | hexadecimal escape |
| Section 2.3.1.1 |
表4: エスケープ列の置換
name-selector をオブジェクトノードに適用すると, 名前がメンバ名 M に等しいメンバ値を選択し, そのようなメンバ値がなければ何も選択しません. オブジェクトでない値からは何も選択されません.
注: name selector の処理では, メンバ名文字列 M をセレクタが適用される JSON 内のメンバ名文字列と比較する必要があります. 2つの文字列は, 同一の Unicode スカラー値の列である場合に限り等しいと見なさなければなりません (MUST). 言い換えれば, 比較の前に JSONPath からのメンバ名文字列 M または JSON 内のメンバ名文字列のいずれにも正規化操作を適用してはなりません (MUST NOT).
2.3.1.3 Examples (例)
JSON:
{
"o": {"j j": {"k.k": 3}},
"'": {"@": 2}
}
Queries:
表5の例は child segment による name selector の使用を示します.
| Query | Result | Result Paths | Comment |
|---|---|---|---|
| $.o['j j'] | {"k.k": | $['o']['j j'] | ネストした |
| 3} | オブジェクト内の | ||
| 名前付き値 | |||
| $.o['j j']['k.k'] | 3 | $['o']['j j']['k.k'] | さらに深く |
| ネスト | |||
| $.o["j j"]["k.k"] | 3 | $['o']['j j']['k.k'] | クエリでは異なる |
| 区切り子, | |||
| Normalized Path | |||
| は不変 | |||
| $["'"]["@"] | 2 | $[''']['@'] | 珍しい |
| メンバ名 |
表5: Name Selector の例
2.3.2 Wildcard Selector (ワイルドカードセレクタ)
2.3.2.1 Syntax (構文)
wildcard selector はアスタリスクからなります.
wildcard-selector = "*"
2.3.2.2 Semantics (意味論)
wildcard selector はオブジェクトまたは配列のすべての子のノードを選択します. JSON オブジェクトは順序を持たないため, オブジェクトの子が結果ノードリストに現れる順序は規定しません. 配列の子は結果ノードリストに配列順で現れます.
オブジェクトの子はメンバ値であり, メンバ名ではないことに注意してください.
wildcard selector はプリミティブ JSON 値 (数値, 文字列, true, false, null) からは何も選択しません.
2.3.2.3 Examples (例)
JSON:
{
"o": {"j": 1, "k": 2},
"a": [5, 3]
}
Queries:
表6の例は child segment による wildcard selector の使用を示します.
| Query | Result | Result | Comment |
|---|---|---|---|
| Paths | |||
| $[*] | {"j": 1, | $['o'] | オブジェクト値 |
| "k": 2} | $['a'] | ||
| [5, 3] | |||
| $.o[*] | 1 | $['o']['j'] | オブジェクト値 |
| 2 | $['o']['k'] | ||
| $.o[*] | 2 | $['o']['k'] | 別の結果 |
| 1 | $['o']['j'] | ||
| $.o[*, | 1 | $['o']['j'] | 非決定的 |
| *] | 2 | $['o']['k'] | 順序付け |
| 2 | $['o']['k'] | ||
| 1 | $['o']['j'] | ||
| $.a[*] | 5 | $['a'][0] | 配列メンバ |
| 3 | $['a'][1] |
表6: Wildcard Selector の例
上のクエリ $.o[*, *] の例は, wildcard selector が2つ以上メンバを持つオブジェクトノードに適用されるとき, child segment 内に現れるたびに異なる順序のノードリストを生成しうることを示します (2未満のメンバを持つオブジェクトノードまたは配列ノードに適用する場合はそうではありません).
2.3.3 Index Selector (インデックスセレクタ)
2.3.3.1 Syntax (構文)
index selector <index> は高々1つの配列要素値に一致します.
index-selector = int ; decimal integer
int = "0" /
(["-"] DIGIT1 *DIGIT) ; - optional
DIGIT1 = %x31-39 ; 1-9 non-zero digit
数値 index-selector を適用すると対応する要素を選択します. JSONPath は負の値を許します (第2.3.3.2節参照).
妥当であるには, index selector の値は I-JSON の正確な値の範囲内でなければなりません (MUST) (第2.1節参照).
注:
-
index-selector は整数です (JSON 数と同様10進).
-
JSON 数と同様, 構文は
01や-01のような先頭ゼロの8進風整数を許しません.
2.3.3.2 Semantics (意味論)
非負の index-selector を配列に適用すると, ゼロ始まりインデックスで配列要素を選択します. 例えばセレクタ 0 は最初, セレクタ 4 は十分長い配列の5番目の要素を選択します. インデックスが配列の範囲外なら何も選択され, エラーではありません. 配列でない値からは何も選択されません.
負の index-selector は配列末尾から逆方向に数え, 配列の長さを負のインデックスに加えることで等価な非負 index-selector を得ます. 例えばセレクタ -1 は最後, セレクタ -2 は少なくとも2要素の配列の最後から2番目を選択します. 非負インデックスと同様, そのような要素が存在しなくてもエラーではありません. 単に要素が選択されないだけです.
2.3.3.3 Examples (例)
JSON:
["a","b"]
Queries:
表7の例は child segment による index selector の使用を示します.
| Query | Result | Result Paths | Comment |
|---|---|---|---|
| $[1] | "b" | $[1] | 配列の要素 |
| $[-2] | "a" | $[0] | 末尾から見た配列の要素 |
表7: Index Selector の例
2.3.4 Array Slice Selector (配列スライスセレクタ)
2.3.4.1 Syntax (構文)
array slice selector の形は <start>:<end>:<step> です. インデックス <start> から始まり <end> には至らない (含まない) ところまで, 既定1の step で増分しながら配列から要素に一致します.
slice-selector = [start S] ":" S [end S] [":" [S step ]]
start = int ; included in selection end = int ; not included in selection step = int ; default: 1
slice selector はコロンで区切られた3つの任意10進整数からなります. 第3整数を省略する場合は第2コロンも省略できます.
妥当であるには, 与えられた整数は I-JSON の正確な値の範囲内でなければなりません (MUST) (第2.1節参照).
2.3.4.2 Semantics (意味論)
slice selector はリリースされなかった ECMAScript 4 (ES4) に提案されたスライス演算子および Python のそれに触発されています.
2.3.4.2.1 Informal Introduction (非形式的導入)
本小節は参考情報です.
配列スライスは ECMA-262 標準 [ECMA-262] で定義される JavaScript 言語の Array.prototype.slice メソッドの振る舞いに触発され, Python の slice 式に触発された step パラメータを追加しています.
配列スライス式 start:end:step は, start から始め step ずつ増分し, end (自身は除外) で終わるインデックスの要素を選択します. したがって例えば式 1:3 (step は既定1) はインデックス 1 と 2 の要素を (この順で) 選択し, 1:5:2 はインデックス 1 と 3 を選択します.
step が負のとき, 要素は逆順に選択されます. したがって例えば 5:1:-2 はインデックス 5 と 3 を (この順で) 選択し, ::-1 は配列のすべての要素を逆順に選択します.
step が 0 のとき, 要素は選択されません. (これは Python の振る舞いとは異なる唯一のケースで, Python はこの場合エラーを発生させます.)
次節は JavaScript や Python の振る舞いに依存せず振る舞いを完全に規定します.
2.3.4.2.2 Normative Semantics (規範的意味論)
slice 式は, step パラメータの符号に応じて入力配列と同じ順または逆順で入力配列の要素の部分集合を選択します. 配列でないノードからはノードを選択しません.
slice は2つのスライスパラメータ start と end, および反復増分 step によって定義されます. これらはいずれも任意です. 本小節の以降, len は入力配列の長さを表します.
step の既定値は 1 です. start と end の既定値は step の符号に依存し, 表8に示します.
| Condition | start | end |
|---|---|---|
| step >= 0 | 0 | len |
| step < 0 | len - 1 | -len - 1 |
表8: 配列スライスの既定 start および end 値
slice 式のパラメータ start と end はスライス境界として直接使用できず, まず正規化が必要です. この目的の正規化は次のとおり定義されます:
FUNCTION Normalize(i, len): IF i >= 0 THEN RETURN i ELSE RETURN len + i END IF
長さ len の配列に適用した配列インデックス式 i の結果は, 配列スライス式 Normalize(i, len):Normalize(i, len)+1:1 の結果です.
slice 式のパラメータ start と end からスライス境界 lower と upper を導出します. step の符号で定義される反復の方向が, どちらのパラメータが下界でどちらが上界かを決めます:
FUNCTION Bounds(start, end, step, len): n_start = Normalize(start, len) n_end = Normalize(end, len)
IF step >= 0 THEN lower = MIN(MAX(n_start, 0), len) upper = MIN(MAX(n_end, 0), len) ELSE upper = MIN(MAX(n_start, -1), len-1) lower = MIN(MAX(n_end, -1), len-1) END IF
RETURN (lower, upper)
slice 式は lower と upper の境界の間のインデックスの要素を選択します. 次の疑似コードで, a(i) は配列 a の i+1 番目の要素です (すなわち a(0) が最初, a(1) が次, 以下同様).
IF step > 0 THEN
i = lower WHILE i < upper: SELECT a(i) i = i + step END WHILE
ELSE if step < 0 THEN
i = upper WHILE lower < i: SELECT a(i) i = i + step END WHILE
END IF
step = 0 のとき, 要素は選択されず, 結果配列は空です.
2.3.4.3 Examples (例)
JSON:
["a", "b", "c", "d", "e", "f", "g"]
Queries:
表9の例は child segment による array slice selector の使用を示します.
| Query | Result | Result | Comment |
|---|---|---|---|
| Paths | |||
| $[1:3] | "b" | $[1] | 既定 step |
| "c" | $[2] | によるスライス | |
| $[5:] | "f" | $[5] | 終端インデックス |
| "g" | $[6] | なしのスライス | |
| $[1:5:2] | "b" | $[1] | step 2 の |
| "d" | $[3] | スライス | |
| $[5:1:-2] | "f" | $[5] | 負の step の |
| "d" | $[3] | スライス | |
| $[::-1] | "g" | $[6] | 逆順の |
| "f" | $[5] | スライス | |
| "e" | $[4] | ||
| "d" | $[3] | ||
| "c" | $[2] | ||
| "b" | $[1] | ||
| "a" | $[0] |
表9: Array Slice Selector の例
2.3.5 Filter Selector (フィルタセレクタ)
Filter selector は構造化値, すなわち JSON 配列とオブジェクトの要素またはメンバを反復するために用いられます. 構造化値はフィルタセレクタを用いる child または descendant segment が提供するノードリストで識別されます.
各反復 (要素またはメンバ) について論理式 (filter expression (フィルタ式)) が評価され, 要素またはメンバのノードを選択するかどうかを決めます. (論理式は数学的には Boolean 値に評価されますが, 本仕様は JSON が表しうる Boolean 値との区別のために logical (論理的) という用語を用います.)
反復処理中, フィルタ式はフィルタ対象の構造化値の各配列要素またはオブジェクトメンバ値のノードを受け取り, その要素またはメンバ値は current node (現在ノード) と呼ばれます.
現在ノードはフィルタ式の部分式における1つ以上の JSONPath クエリの起点として, current-node-identifier @ で表記できます. 各 JSONPath クエリは, クエリ結果の存在検査, そのクエリから得た特定の JSON 値を比較で用いること, または function argument (関数引数) として用いられます.
Filter selector は第2.4節で扱う関数拡張を用いうります. フィルタセレクタの論理式内では, 関数式がノードリストと値に作用できます. 利用可能な関数の集合は拡張可能で, 複数の関数が事前定義され (第2.4節参照), "Function Extensions" サブレジストリ (第3.2節) によりさらに登録できます. 関数が定義されると一意の名前が与えられ, 戻り値と各パラメータに declared type (宣言型) が与えられます. 型システムの範囲は限定的で, 関数がなければ暗黙的だった制約を表現する目的があります. 型システムはまた, 関数式を用いない場合の文法における式の扱いを模倣する変換 (第2.4.2節) も導きます.
2.3.5.1 Syntax (構文)
フィルタセレクタの形は ?<logical-expr> です.
filter-selector = "?" S logical-expr
フィルタ式は副作用のない構成要素からなるため, 評価順を定義する必要はなく (定義されてもいません), 同様に conjunction (&&) と disjunction (||) (後述) については, short-circuiting と完全評価の実装のいずれも同一結果に至るため, どちらの戦略も妥当です.
現在ノードは current node identifier @ によりアクセスできます. この識別子は, 識別子を直接囲む filter-selector の現在ノードを指します. 注: ネストした filter-selector 内では, 識別子を直接囲む filter-selector (すなわち識別子を直接囲む filter-selector を囲む filter-selector) 以外の現在ノードを指す構文はありません.
論理式は通常の Boolean 演算子 (|| は OR, && は AND, ! は NOT) を提供します. これらは Boolean 代数の通常の意味論を持ちその法則に従います (例: [BOOLEAN-LAWS]). 括弧は logical-expr 内のグループ化に用いてもよいです (MAY).
logical-expr が括弧で囲まれた式で構成される必要はありません ([JSONPath-orig] では要求されていました). ただし括弧があってもなくても意味論は同じです.
logical-expr = logical-or-expr logical-or-expr = logical-and-expr *(S "||" S logical-and-expr) ; disjunction ; binds less tightly than conjunction logical-and-expr = basic-expr *(S "&&" S basic-expr) ; conjunction ; binds more tightly than disjunction
basic-expr = paren-expr /
comparison-expr /
test-expr
paren-expr = [logical-not-op S] "(" S logical-expr S ")" ; parenthesized expression logical-not-op = "!" ; logical NOT operator
test expression は, 埋め込まれたクエリで指定されるノードの存在をテストする (第2.3.5.2.1節参照) か, 関数式の結果をテストします (第2.4節参照). 後者の場合, 関数の宣言結果型が LogicalType (第2.4.1節参照) なら結果が LogicalTrue かをテストし, NodesType なら結果が空でないかをテストします. 宣言結果型が ValueType なら test expression での使用は well-typed ではありません (第2.4.3節参照).
test-expr = [logical-not-op S]
(filter-query / ; existence/non-existence
function-expr) ; LogicalType or NodesType
filter-query = rel-query / jsonpath-query
rel-query = current-node-identifier segments
current-node-identifier = "@"
比較式はプリミティブ値 (数値, 文字列, true, false, null) 間の比較に利用できます. これらはリテラル値, 高々1ノードを選択する singular query (その値が用いられる), または ValueType の関数式 (第2.4節参照) から得られます.
comparison-expr = comparable S comparison-op S comparable
literal = number / string-literal /
true / false / null
comparable = literal /
singular-query / ; singular query value
function-expr ; ValueType
comparison-op = "==" / "!=" /
"<=" / ">=" /
"<" / ">"
singular-query = rel-singular-query / abs-singular-query
rel-singular-query = current-node-identifier singular-query-segments
abs-singular-query = root-identifier singular-query-segments
singular-query-segments = *(S (name-segment / index-segment))
name-segment = ("[" name-selector "]") /
("." member-name-shorthand)
index-segment = "[" index-selector "]"
リテラルは JSON で通常の記法 (文字列に single-quote 区切りを拡張) で表記できます.
注: 引用符付き文字列内の英字は ABNF では大文字小文字を区別しないため, 浮動小数点数内の ABNF 表現 "e" は文字 e または E のいずれかです.
true, false, null は小文字のみです (大文字小文字を区別).
number = (int / "-0") [ frac ] [ exp ] ; decimal number
frac = "." 1*DIGIT ; decimal fraction
exp = "e" [ "-" / "+" ] 1*DIGIT ; decimal exponent
true = %x74.72.75.65 ; true
false = %x66.61.6c.73.65 ; false
null = %x6e.75.6c.6c ; null
表10はフィルタ式演算子を結合の強さが高い順 (最も強く結合) から低い順に示します.
| Precedence | Operator type | Syntax | ||
|---|---|---|---|---|
| 5 | Grouping | (...) | ||
| Function Expressions | name(...) | |||
| 4 | Logical NOT | ! | ||
| 3 | Relations | == != | ||
| < <= > >= | ||||
| 2 | Logical AND | && | ||
| 1 | Logical OR |
表10: フィルタ式演算子の優先順位
2.3.5.2 Semantics (意味論)
フィルタセレクタは配列とオブジェクトにのみ作用します. その結果は, それぞれ配列要素またはメンバ値の (zero, one, multiple, all) のリストです. プリミティブ値に適用すると何も選択しません (したがってフィルタセレクタの結果に寄与しません).
結果ノードリストでは配列の子は配列内の位置順に並びます. JSON オブジェクトは順序を持たないため, オブジェクトの子 (配列と異なる) が結果ノードリストに現れる順序は規定しません.
2.3.5.2.1 Existence Tests (存在テスト)
論理文脈でのクエリ単体は存在テストであり, クエリが少なくとも1つのノードを選択すれば true, いずれのノードも選択しなければ false になります.
存在テストは比較と次の点で異なります:
-
singular query に限らず任意の相対または絶対クエリで動作します.
-
構造化値を選択するクエリで動作します.
ノードの値を調べるには明示的な比較が必要です. 例えばクエリ @.foo が選択するノードの値が null かをテストするには @.foo == null を用います (第2.6節参照). 否定存在テスト [email protected] (ノードが選択されれば値に関わらず false) ではありません. 同様に @.foo == false は @.foo がノードを選択しその値が false の場合に限り true です.
2.3.5.2.2 Comparisons (比較)
比較演算子 == と < をまず定義し, これらから !=, <=, >, >= を定義します.
比較のいずれかの側が空のノードリストまたは特別な結果 Nothing (第2.4.1節参照) になるとき:
-
==による比較は, 他側も空のノードリストまたは Nothing の場合に限り true です. -
<による比較は false です.
比較のいずれかの側のクエリまたは関数式が単一ノードからなるノードリストを生成するとき, その側はノードの値に置換されてから:
-
==による比較は次の場合に限り true です:-
I-JSON [RFC7493] 第2.2節に従い相互運用が期待される数値同士が, 通常の数学的等価で等しい,
-
少なくとも一方が I-JSON に従い相互運用が期待されない数値同士で, 実装依存の等価で等しい,
-
数でない等しいプリミティブ値同士,
-
等しい配列, すなわち同じ長さで第1配列の各要素が第2配列の対応要素と等しい,
-
重複名のない等しいオブジェクト, すなわち:
o 両オブジェクトが (重複なく) 同じ名前の集合を持ち,
o それらの各名前についてオブジェクトが関連付ける値が等しい.
-
-
<による比較は, 両方が数値または両方が文字列で次を満たす場合に限り true です:-
I-JSON [RFC7493] 第2.2節に従い相互運用が期待される数値は, 通常の数学的順序で比較しなければなりません (MUST). I-JSON に従い相互運用が期待されない数値は, 実装依存の順序で比較してもよいです (MAY),
-
空文字列は任意の非空文字列より小さい,
-
非空文字列は, 第1文字列が第2より小さい Unicode スカラー値で始まるか, 両方が同じ Unicode スカラー値で始まり第1の残りが第2の残りより小さい場合に限り, 他の非空文字列より小さい.
-
!=, <=, >, >= は他の比較演算子で定義されます. 任意の a と b について:
-
a != bはa == bが false の場合に限り true. -
a <= bはa < bが true またはa == bが true の場合に限り true. -
a > bはb < aが true の場合に限り true. -
a >= bはb < aが true またはa == bが true の場合に限り true.
2.3.5.3 Examples (例)
最初の例集合は, 入力 JSON 値に対する比較式とその結果を示します.
JSON:
{
"obj": {"x": "y"},
"arr": [2, 3]
}
Comparisons:
| Comparison | Result | Comment |
|---|---|---|
| $.absent1 == $.absent2 | true | 空のノードリスト |
| $.absent1 <= $.absent2 | true | == なら <= |
| $.absent == 'g' | false | 空のノードリスト |
| $.absent1 != $.absent2 | false | 空のノードリスト |
| $.absent != 'g' | true | 空のノードリスト |
| 1 <= 2 | true | 数値比較 |
| 1 > 2 | false | 数値比較 |
| 13 == '13' | false | 型不一致 |
| 'a' <= 'b' | true | 文字列比較 |
| 'a' > 'b' | false | 文字列比較 |
| $.obj == $.arr | false | 型不一致 |
| $.obj != $.arr | true | 型不一致 |
| $.obj == $.obj | true | オブジェクト比較 |
| $.obj != $.obj | false | オブジェクト比較 |
| $.arr == $.arr | true | 配列比較 |
| $.arr != $.arr | false | 配列比較 |
| $.obj == 17 | false | 型不一致 |
| $.obj != 17 | true | 型不一致 |
| $.obj <= $.arr | false | オブジェクトと配列に |
| < 比較なし | ||
| $.obj < $.arr | false | オブジェクトと配列に |
| < 比較なし | ||
| $.obj <= $.obj | true | == なら <= |
| $.arr <= $.arr | true | == なら <= |
| 1 <= $.arr | false | 配列に < 比較なし |
| 1 >= $.arr | false | 配列に < 比較なし |
| 1 > $.arr | false | 配列に < 比較なし |
| 1 < $.arr | false | 配列に < 比較なし |
| true <= true | true | == なら <= |
| true > true | false | Boolean に < 比較なし |
表11: 比較の例
2番目の例集合は, 入力 JSON 値に対して評価したフィルタセレクタを用いる完全な JSONPath クエリとその結果を示します. (注: クエリの2つは関数拡張を用います, 詳細は第2.4.6節と第2.4.7節参照.)
JSON:
{
"a": [3, 5, 1, 2, 4, 6,
{"b": "j"},
{"b": "k"},
{"b": {}},
{"b": "kilo"}
],
"o": {"p": 1, "q": 2, "r": 3, "s": 5, "t": {"u": 6}},
"e": "f"
}
Queries:
表12の例は child segment によるフィルタセレクタの使用を示します.
| Query | Result | Result | Comment | ||
|---|---|---|---|---|---|
| Paths | |||||
| $.a[[email protected] == | {"b": | $['a'][9] | メンバ値 | ||
| 'kilo'] | "kilo"} | 比較 | |||
| $.a[?(@.b == | {"b": | $['a'][9] | 括弧付き | ||
| 'kilo')] | "kilo"} | 等価クエリ | |||
| $.a[?@>3.5] | 5 | $['a'][1] | 配列値 | ||
| 4 | $['a'][4] | 比較 | |||
| 6 | $['a'][5] | ||||
| $.a[[email protected]] | {"b": "j"} | $['a'][6] | 配列値 | ||
| {"b": "k"} | $['a'][7] | 存在 | |||
| {"b": {}} | $['a'][8] | ||||
| {"b": | $['a'][9] | ||||
| "kilo"} | |||||
| $[?@.*] | [3, 5, 1, | $['a'] | 非単一 | ||
| 2, 4, 6, | $['o'] | クエリの存在 | |||
| {"b": "j"}, | |||||
| {"b": "k"}, | |||||
| {"b": {}}, | |||||
| {"b": | |||||
| "kilo"}] | |||||
| {"p": 1, | |||||
| "q": 2, | |||||
| "r": 3, | |||||
| "s": 5, | |||||
| "t": {"u": | |||||
| 6}} | |||||
| $[?@[[email protected]]] | [3, 5, 1, | $['a'] | ネストした | ||
| 2, 4, 6, | フィルタ | ||||
| {"b": "j"}, | |||||
| {"b": "k"}, | |||||
| {"b": {}}, | |||||
| {"b": | |||||
| "kilo"}] | |||||
| $.o[?@<3, ?@<3] | 1 | $['o']['p'] | 非決定的 | ||
| 2 | $['o']['q'] | 順序付け | |||
| 2 | $['o']['q'] | ||||
| 1 | $['o']['p'] | ||||
| $.a[?@<2 | @.b | 1 | $['a'][2] | 配列値 | |
| == "k"] | {"b": "k"} | $['a'][7] | 論理 OR | ||
| $.a[?match(@.b, | {"b": "j"} | $['a'][6] | 配列値 | ||
| "[jk]")] | {"b": "k"} | $['a'][7] | 正規表現 | ||
| 一致 | |||||
| $.a[?search(@.b, | {"b": "j"} | $['a'][6] | 配列値 | ||
| "[jk]")] | {"b": "k"} | $['a'][7] | 正規表現 | ||
| {"b": | $['a'][9] | 検索 | |||
| "kilo"} | |||||
| $.o[?@>1 && @<4] | 2 | $['o']['q'] | オブジェクト値 | ||
| 3 | $['o']['r'] | 論理 AND | |||
| $.o[?@>1 && @<4] | 3 | $['o']['r'] | 別の結果 | ||
| 2 | $['o']['q'] | ||||
| $.o[[email protected] | @.x] | {"u": 6} | $['o']['t'] | オブジェクト値 | |
| 論理 OR | |||||
| $.a[[email protected] == $.x] | 3 | $['a'][0] | 値のない | ||
| 5 | $['a'][1] | クエリ同士の | |||
| 1 | $['a'][2] | 比較 | |||
| 2 | $['a'][3] | ||||
| 4 | $['a'][4] | ||||
| 6 | $['a'][5] | ||||
| $.a[?@ == @] | 3 | $['a'][0] | プリミティブと | ||
| 5 | $['a'][1] | 構造化値の | |||
| 1 | $['a'][2] | 比較 | |||
| 2 | $['a'][3] | ||||
| 4 | $['a'][4] | ||||
| 6 | $['a'][5] | ||||
| {"b": "j"} | $['a'][6] | ||||
| {"b": "k"} | $['a'][7] | ||||
| {"b": {}} | $['a'][8] | ||||
| {"b": | $['a'][9] | ||||
| "kilo"} |
表12: Filter Selector の例
上のクエリ $.o[?@<3, ?@<3] の例は, フィルタセレクタが child segment 内に現れるたびに異なる順序のノードリストを生成しうることを示します.