
(開発依存関係のライセンスも参照してください:licenses for dev. deps.)
JSONドキュメント(およびJavaScriptオブジェクト)からデータを分析、変換、選択的に抽出します。
jsonpath-plus は元の仕様を拡張し、いくつかの追加演算子を加え、元の仕様が明確にしていなかった動作を明示します。
ブラウザデモ または Runkit (Node) をお試しください。
注意:このプロジェクトは現在積極的にはメンテナンスされていません。十分に文書化されたPRや簡単な更新は受け付ける場合がありますが、修正や新機能の追加を自ら行う予定はありません。
^~@null()、@boolean()、@number()、@string()、@array()、@object()@integer()@scalar()(JavaScriptオブジェクトをクエリする際には undefined や非有限数も受け入れ、基本的な非オブジェクト・非関数型もすべて受け入れます)otherTypeCallback と組み合わせて使用できる @other()jsonpath-plus は、json-querying-performance-testing によると、他のJSONクエリライブラリと比較して、大規模および小規模のデータセットの両方で一貫して高性能です。これらの結果は、プロジェクトを自分で実行 して、さらにパフォーマンスケースを追加することで検証できます。
npm install jsonpath-plus
## セットアップ
### Node.js```js
const {JSONPath} = require('jsonpath-plus');
const result = JSONPath({path: '...', json});
ブラウザで使用する場合は、dist/index-browser-umd.cjs を直接インクルードできます。Browserify の仕掛けは不要です。```html
### ESM(モダンブラウザ)
ES6 モジュールのインポート(モダンブラウザ向け)を使用することもできます:```html
<script type="module">
import {
JSONPath
} from './node_modules/jsonpath-plus/dist/index-browser-esm.js';
const result = JSONPath({path: '...', json: {}});
</script>
JavaScriptをバンドルしている場合(例:Rollupを使用)、単に次を使用してください。
mainFields
には、ブラウザビルド用にbrowserを含める必要があることに注意してください
(Nodeの場合は、moduleをチェックするデフォルトで問題ありません):```js
import {JSONPath} from 'jsonpath-plus';
const result = JSONPath({path: '...', json});
## 使用方法
利用可能な完全なシグネチャは次のとおりです:```
const result = JSONPath([options,] path, json, callback, otherTypeCallback);
引数 path、json、callback、および otherTypeCallback
は、options 上で(利用可能な他のプロパティとともに)代替的に
表現することもできます。
result には見つかったすべてのアイテムが含まれる(オプションで
配列にラップされる)のに対し、callback は各アイテムが発見されるたびに
何らかの操作を実行したい場合に使用でき、コールバック関数は結果内で
見つかる独立したアイテムの数に応じて 0 回から N 回実行されます。
JSONPath の利用可能な引数の詳細については、以下のドキュメントを参照してください。
API ドキュメント も参照してください。
options オブジェクトまたは evaluate メソッド(最初の引数として)で 指定できるプロパティには、以下が含まれます:
false として指定された場合、
evaluate メソッドを手動で呼び出すことができます。wrap が false に設定され、
結果が見つからない場合、undefined が返されます(wrap が true に設定されている場合の
空の配列とは対照的です)。wrap が false に設定され、単一の非配列の結果が見つかった場合、
その結果が唯一の返されるアイテムになります(配列内ではありません)。ただし、複数の結果が
見つかった場合は、依然として配列が返されます。曖昧さを避けるため(失敗である結果と
空の配列である結果を区別する必要がある場合)、デフォルトを に切り替えることを
お勧めします。autostart プロパティが false に設定されている場合にのみ必要です。
同じ設定を使用した繰り返しの評価に使用できます。
リストされたプロパティに加えて、後者のメソッドパターンは、
他の許可されたインスタンスプロパティのいずれも受け入れることができます
(ここでは関連性のない autostart を除く)。['$', 'aProperty', 'anotherProperty']。$['aProperty']['anotherProperty][0]。JSONPath の終端構文
~ と ^、および @string() のような型演算子は静かに削除されます。/aProperty/anotherProperty/0
(内部の ~ と / 文字は JSON Pointer 仕様に従ってエスケープされます)。JSONPath の終端構文
~ と ^、および @string() のような型演算子は静かに削除されます。http://goessner.net/articles/JsonPath/ から取得した次の JSON を前提とします:```json { "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } }
and the following XML representation:```xml
<store>
<book>
<category>reference</category>
<author>Nigel Rees</author>
<title>Sayings of the Century</title>
<price>8.95</price>
</book>
<book>
<category>fiction</category>
<author>Evelyn Waugh</author>
<title>Sword of Honour</title>
<price>12.99</price>
</book>
<book>
<category>fiction</category>
<author>Herman Melville</author>
<title>Moby Dick</title>
<isbn>0-553-21311-3</isbn>
<price>8.99</price>
</book>
<book>
<category>fiction</category>
<author>J. R. R. Tolkien</author>
<title>The Lord of the Rings</title>
<isbn>0-395-19395-8</isbn>
<price>22.99</price>
</book>
<bicycle>
<color>red</color>
<price>19.95</price>
</bicycle>
</store>
以下のXPathの例では、要素とそのテキストコンテンツの取得を(比較に役立つ場合や曖昧さを避ける場合を除いて)区別していないことに注意してください。なお、XPathの例(2.0のものも含む)をテストするには、このデモが役立つかもしれません(xmlまたはxml-strictに設定してください)。| XPath | JSONPath | 結果 | 備考 |
|-------------------------------------------------------------------------------------|---------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| /store/book/author | $.store.book[*].author | ストア内のすべての本の著者 | を付けずに と表記することも可能(ただし、これは元の仕様には存在しない)。一部の文字リテラル( と )はエスケープが必要な点に注意 |
| | | すべての著者 | |
| | | ストア内のすべてのもの。つまり、その本(本の配列)と赤い自転車(自転車オブジェクト)。 | |
| | | ストア内のすべてのものの価格。 | |
| | | 3番目の本(本オブジェクト) | |
| | | 順序における最後の本。 | 特殊文字を含むプロパティにアクセスするには、フィルタに を利用する(この特定の機能は元の仕様には存在しない) |
| | | 最初の2冊の本 | |
| または XPath 2.0 の | | すべての本のカテゴリと著者 | |
| | | ISBN番号を持つすべての本をフィルタリング | 特殊文字を含むプロパティにアクセスするには、フィルタに を利用する(この特定の機能は元の仕様には存在しない) |
| | | 10より安いすべての本をフィルタリング | |
| | | プロパティが price であり、かつ 8.95 と等しくないオブジェクトのすべてのプロパティ値を取得 | 裸の を使用すると、プロパティ値によってオブジェクトをフィルタリングできる(必ずしも配列内である必要はない)。式の後に を追加すると、フィルタリングされたプロパティを持つオブジェクトを取得できる |
| | | JSONオブジェクトのルート(つまり、オブジェクト自体全体) | リテラルの (単独またはパス内のどこでも)を取得するには、バッククォートエスケープを使用する必要がある |
| | | XMLドキュメントのルート以下のすべての要素(およびテキスト)。JSON構造のルート以下のすべてのメンバー。 | |
| | | XMLドキュメント内のすべての要素。ルートを含むJSON構造のすべての親コンポーネント。 | この動作は元の仕様では直接指定されていなかった |
| | | 価格が19より大きい特定のアイテムの親(つまり、自転車の親としてのストア値、および個々の本の親としての本の配列) | 親(キャレット)は元の仕様には存在しない |
| (XPath 2.0) | | ストアサブオブジェクトのプロパティ名("book" と "bicycle")。ワイルドカードプロパティで有用。 | プロパティ名(チルダ)は元の仕様には存在しない |
| (XPath 2.0) | | 最初の本を指すパスにある本以外のすべての本 | は元の仕様には存在しない |
| | | 本の親オブジェクトが、色が赤である自転車の子を持つ本のすべてのカテゴリを取得(つまり、すべての本) | は元の仕様には存在しない |
| | | "book" のすべての子のうち、"category" のものを除いて取得 | は元の仕様には存在しない |
| | | プロパティ(配列内に入るため数値インデックスとなる)が0ではないすべての本を取得 | は元の仕様には存在しない |
| | | 親プロパティが book ではないストアの孫を取得(つまり、自転車の子、"color" と "price") | は元の仕様には存在しない |
| | | これらの値の親プロパティ(つまり、本アイテムの親オブジェクトを保持する配列インデックス)が0ではない、すべての本インスタンスのプロパティ値を取得 | は元の仕様には存在しない |
| | | 価格が3番目の本の価格と等しいすべての本をフィルタリング | は元の仕様には存在しない |
| (XPath 2.0) | | 本の配列内の数値を取得 | 、その他の基本型(、)、その他の低レベル派生型(、、)、JSONSchema で追加された型 、複合型 (JavaScript オブジェクトの と非有限数、および基本的な非オブジェクト/非関数型のすべても受け入れる)、ユーザー定義コールバックと組み合わせて使用する型 ( を参照)、および JSONPath で非 JSON の JavaScript オブジェクトをクエリする際に使用できる以下の非 JSON 型(、、)は元の仕様には存在しない |
| (XPath 2.0) | | 正規表現に一致する(大文字小文字を区別せず 'TION' で終わる)すべての本のカテゴリ | は元の仕様には存在しない。 |
| (XPath 2.0) | | 正規表現に一致するプロパティを持つすべての本(大文字小文字を区別せず 'TION' で終わる) | は元の仕様には存在しない。注: 式の最後に親セレクタ を使用して親オブジェクトに戻る。親セレクタがない場合、2つの キー値に一致する。 |
| | (例: でリテラルに という名前のプロパティに一致) | 後続のシーケンス全体をエスケープする(リテラルとして扱う) | は元の仕様には存在しない。リテラルのバッククォートを取得するには、追加のバッククォートでエスケープする | を使用してアクセスします。
| のような)とグループ化のサポート。Node でテストを実行する場合:```shell npm test
ブラウザ内テストの場合:
- js/htmlファイルを配信します:```shell
npm run browser-test
重要なセキュリティ上の考慮事項と脆弱性の報告方法については、SECURITY.md を参照してください。
@undefined()、@function()、@nonFinite())@path/@parent/@property/@parentProperty/@root ショートハンドセレクター`@['...']/?@['...'] 構文$.. のドキュメント(すべての親コンポーネントの取得)falsesafe: ブラウザでは、eval や Function を使用せず、Content Security Policy を満たす
最小限のスクリプトエンジンを使用します。NodeJS では、効果がなく、スクリプトがそこで安全であるため
native と同等です。
native: ネイティブのスクリプト機能を使用します。つまり、ブラウザでは安全でない eval または
Function、nodejs では vm.Script を使用します。false: JavaScript の評価式を無効にし、
これらの式が試行されたときに例外をスローします。
callback [ (code, context) => value]: code と context を引数として呼び出され、
評価された値を返すカスタム実装。
class: code をコンストラクタ引数として作成され、context を指定して runInNewContext を
呼び出すことでコードが評価されるクラス。
``parentProperty を結果内で返すことができます。これは
文字列のプロパティ名または数値の配列インデックスである場合があります。resultType に従う)、
ペイロードの型(通常の "value" か "property" 名か)、および完全なペイロードオブジェクト
(すべての resultType を含む)です。@other() を追加することで、
組み込み型を超えた型を決定できます。そのようなパスが検出された場合、otherTypeCallback は
アイテムの値、そのパス、その親、およびその親のプロパティ名とともに呼び出され、
指定された値が "other" 型に属するかどうかを示すブール値を返す必要があります
(または変換を処理して false を返すこともできます)。$.store.book[*].author$@//author$..author/store/*$.store.*/store//price$.store..price//book[3]$..book[2]//book[last()]$..book[(@.length-1)]$..book[-1:][(@['...'])]//book[position()<3]$..book[0,1]$..book[:2]//book/*[self::category\|self::author]//book/(category,author)$..book[0][category,author]//book[isbn]$..book[?(@.isbn)][?@['...']]//book[price<10]$..book[?(@.price<10)]//*[name() = 'price' and . != 8.95]$..*[?(@property === 'price' && @ !== 8.95)]@^/$$//*/*\|//*/*/text()$..*//*$..//*[price>19]/..$..[?(@.price>19)]^/store/*/name()$.store.*~/store/book[not(. is /store/book[1])]$.store.book[?(@path !== "$['store']['book'][0]")]@path//book[parent::*/bicycle/color = "red"]/category$..book[?(@parent.bicycle && @parent.bicycle.color === "red")].category@parent//book/*[name() != 'category']$..book.*[?(@property !== "category")]@property//book[position() != 1]$..book[?(@property !== 0)]@property/store/*/*[name(parent::*) != 'book']$.store.*[?(@parentProperty !== "book")]@parentProperty//book[count(preceding-sibling::*) != 0]/*/text()$..book.*[?(@parentProperty !== 0)]@parentProperty//book[price = /store/book[3]/price]$..book[?(@.price === @root.store.book[2].price)]@root//book/../*[. instance of element(*, xs:decimal)]$..book..*@number()@number()@boolean()@string()@null()@object()@array()@integer()@scalar()undefined@other()otherTypeCallback@undefined()@function()@nonFinite()//book/*[name() = 'category' and matches(., 'tion$')]$..book.*[?(@property === "category" && @.match(/TION$/i))]@property//book/*[matches(name(), 'bn$')]/parent::*$..book.*[?(@property.match(/bn$/i))]^@property^isbn` `$$`npx jsonpath-plus <json-file> <jsonpath-query>