Appendix B. Inspired by XPath (付録 B. XPath に触発されて)
Appendix B. Inspired by XPath (XPath に触発されて)
本付録は参考情報です.
JSONPath が考案された当時, XML では XML 文書の分析, 変換, 選択的抽出のための強力なツールが利用可能であることで知られていました. [XPath] はそのようなツールの1つです.
2007年までに, 台頭しつつあった JSON コミュニティに対して同種の問題を解く何かの必要性が明らかになりました. 特に次の用途向けです:
-
特別なスクリプトなしに JSON 値 [RFC8259] から対話的にデータを見つけ抽出すること, および
-
クライアントからのリクエストで JSON データの関連部分を指定し, サーバが応答のデータ量を減らして帯域を最小化できるようにすること.
(注: XPath は2007年以降も進化し, 最近の版は名目上 JSON 値内での操作もサポートします. 本付録では2007年に利用可能だったより広く使われた XPath の版のみを扱います.)
JSONPath は XPath の全体的な感覚を取り入れますが, 概念を JSON を動的言語で用いる人に馴染みのある構文 (および部分的に意味論) に写像します.
例えば JavaScript, Python, PHP などの人気の動的プログラミング言語では, XPath 式
/store/book[1]/title
の意味論は式
x.store.book[0].title
または bracket notation では
x['store']['book'][0]['title']
で実現できます. 変数 x がクエリ引数を保持します.
JSONPath 言語は次を満たすよう設計されました:
-
それらの言語特性に自然に基づくこと,
-
XPath 1.0 の最も不可欠な部分のみをカバーすること,
-
コードサイズとメモリ消費において軽量であること,
-
実行時に効率的であること.
B.1 JSONPath and XPath (JSONPath と XPath)
JSONPath 式は JSON 値に適用されるのと同様に, XPath 式は XML 文書と組み合わせて用いられます. JSONPath はクエリ引数のルートノードを指すために $ を用い, これは XPath の先頭の / に似ています.
JSONPath 式は階層をさらに下る際に dot notation ($.store.book[0].title) または bracket notation ($['store']['book'][0]['title']) を用います. どちらもクエリ式内の XPath の / に代わり, dot notation は軽量だが限定的な構文, bracket notation は重量級だがより一般的な構文です.
JSONPath と XPath はどちらもワイルドカードに * を用います. JSONPath の .. で始まる descendant segment 表記は [E4X] から借用され, XPath の // に似ています. 配列スライス構造 [start:end:step] は JSONPath 独自で, ECMASCRIPT 4 の [SLICE] に触発されています.
フィルタ式は次の構文でサポートされます ?<logical-expr>, 例:
$.store.book[[email protected] < 10].title
表20は表1を拡張し, 類似の XPath 概念との比較を示します.
| XPath | JSONPath | Description (説明) | |
|---|---|---|---|
| / | $ | ルート XML 要素 | |
| . | @ | 現在の XML 要素 | |
| / | . or [] | 子演算子 | |
| .. | n/a | 親演算子 | |
| // | ..name, | 子孫 (JSONPath は E4X から | |
| ..[index], ..*, | この構文を借用) | ||
| or ..[*] | |||
| * | * | ワイルドカード: 名前に関わらず | |
| すべての XML 要素 | |||
| @ | n/a | 属性アクセス: JSON 値には | |
| 属性がない | |||
| [] | [] | XML 要素集合の反復と | |
| 述語に用いる添字演算子 | |||
| [,] | 和集合演算子 (node set の | ||
| 結合); JSONPath では list | |||
| operator と呼ばれ, メンバ名, | |||
| 配列インデックス, スライスを | |||
| 組み合わせ可能 | |||
| n/a | [start:end:step] | ES4 から借用した | |
| 配列スライス演算子 | |||
| [] | ? | フィルタ (スクリプト) | |
| 式を適用 | |||
| seamless | n/a | 式エンジン | |
| () | n/a | グループ化 |
表20: XPath 構文と JSONPath の比較
さらに例示するため, 表21は一部の XPath 式と JSONPath 等価式を示します.
| XPath | JSONPath | Result (結果) |
|---|---|---|
| /store/book/author | $.store.book[*].author | 店にある |
| すべての本の | ||
| 著者 | ||
| //author | $..author | すべての著者 |
| /store/* | $.store.* | 店にあるものすべて, |
| すなわち | ||
| いくつかの本と | ||
| 赤い自転車 | ||
| /store//price | $.store..price | 店にある |
| すべてのものの価格 | ||
| //book[3] | $..book[2] | 3冊目の |
| 本 | ||
| //book[last()] | $..book[-1] | 順序上 |
| 最後の本 | ||
| //book[position()<3] | $..book[0,1] | 最初の2冊 |
| $..book[:2] | の本 | |
| //book[isbn] | $..book[[email protected]] | ISBN がある |
| すべての本を | ||
| フィルタ | ||
| //book[price<10] | $..book[[email protected]<10] | 10 未満の |
| すべての本を | ||
| フィルタ | ||
| //* | $..* | XML 文書内の |
| すべての要素, | ||
| 入力値に含まれる | ||
| すべてのメンバ値と | ||
| 配列要素 |
表21: XPath 式の例と JSONPath 等価式
XPath には本比較に挙げた以上に多くの機能 (非省略 location path, 演算子, 関数) があります. さらに XPath と JSONPath で subscript 演算子の働き方には重要な違いがあります:
-
XPath 式の角括弧は常に直前の path fragment から得られる node set に作用します. インデックスは常に1から始まります.
-
JSONPath では角括弧は直前のクエリセグメントから得られる nodelist の各ノードに作用します. 配列インデックスは常に0から始まります.