JSONPathクエリガイド:どのように検索するJSONデータ
JSON已になるWebの通用言語。API戻るJSON,設定ファイル使用JSON,データベース保存するJSONドキュメント。しかし随ているJSON结构变てより大、嵌套より深,検索する特定值变てますます困難。これすぐにはJSONPathの用武之に。JSONPathは一種のクエリする言語,させるあなたできる使用简洁の路径式来ナビゲーションと提取JSONドキュメント中のデータ,すぐにのようなXPath正XML所做のそれ样。このガイドではたから基本構文まで高级フィルターのすべての内容,かつ提供するたあなたできる直ちに適用するの実用的な例。
とはJSONPath?
JSONPathは一種のJSONクエリする言語,最も初由Stefan Goessner于2007年提出。それ提供するたからJSONドキュメント中選択するノードの紧凑構文,類似して于CSS選択する器定位HTML元素またはXPath式定位XMLノード。あなたなし需编写循环と条件逻辑来遍历JSON结构,だけ需编写一つの説明する通往所需データ路径の式。
JSONPath式からJSONドキュメントの根ノード開始する,を通じてオブジェクトと配列ナビゲーションまで所需の值。该言語支持する通配符、再帰的降下、配列スライスとフィルタ式,足もって満たす大多数のデータ提取需求。
サンプルJSONドキュメント
でこのガイド中,私たちする使用もって下JSONドキュメントとして工作例。これは原始JSONPath提案中の经典例,かつ追加するた额外データ:
{
"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
}
}
}JSONPath構文参照
JSONPath使用一小套演算子,それ们コンポジット形成する強力のクエリする。もって下は完全の構文参照:
| 演算子 | 説明する | 例 |
|---|---|---|
| $ | ドキュメントの根ノード | $ |
| . | 子演算子(アクセスするオブジェクト属性) | $.store |
| [] | 配列インデックスまたは子演算子 | $.store.book[0] |
| [*] | すべての配列元素の通配符 | $.store.book[*] |
| .. | 再帰的降下(検索するすべてのレイヤー) | $..author |
| .key | 命名するのオブジェクト属性 | $.store.bicycle |
| ['key'] | 属性アクセスするのブラケット記法 | $['store']['book'] |
| [start:end] | 配列スライス(終了するインデックス不を含む) | $.store.book[0:2] |
| [?()] | フィルタ式 | < 10)] |
| () | 脚本式(に依存する実装する) | $.store.book[(@.length-1)] |
基本JSONPath式
ルートノードと直接の子ノードへのアクセス
美元符号$代表JSONドキュメントの根ノード。からそこ,あなた使用ドット記法アクセスするオブジェクト属性,使用ブラケット記法アクセスする配列インデックス。
| 式 | 結果 |
|---|---|
| $ | 全体のJSONドキュメント |
| $.store | storeオブジェクト(を含むbook配列とbicycleオブジェクト) |
| $.store.bicycle | {"color": "red", "price": 19.95} |
| $.store.bicycle.color | "red" |
| $.store.book | 全体のbook配列 |
| $.store.book[0] | 第一本书オブジェクト |
| $.store.book[0].title | "Sayings of the Century" |
| $.store.book[3].author | "J.R.R. Tolkien" |
ブラケット記法
ブラケット記法はドット記法のの代わりに代方案,時に属性名を含む特殊字符、スペースまたはもって数値開头时とてもあり用:
$.store['book'][0]['title']
$['store']['bicycle']['color']ブラケット記法とドット記法に対してオブジェクト属性はできる互换の。しかし,時に属性名は动态のまたはを含むでドット記法中無効の字符时,必須使用ブラケット記法。
ワイルドカード演算子
ワイルドカード演算子*マッチする配列中のすべての元素またはオブジェクト中のすべての属性。それに対してで不知っている特定键またはインデックスの情况下提取某一层のすべての值極めてあり用。
| 式 | 結果 |
|---|---|
| $.store.* | storeオブジェクト中のすべての值(book配列とbicycleオブジェクト) |
| $.store.book[*] | 配列中のすべての书籍(すべて四个bookオブジェクト) |
| $.store.book[*].author | すべての著者姓名:["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J.R.R. Tolkien"] |
| $.store.*.price | bicycleの价格とbook配列(非単本书の价格) |
再帰的降下:ダブルドット演算子
ダブルドット演算子..はJSONPath最も強力の機能の一つ。それでJSON树の毎一层検索する指定の键,そしてだけでなく仅は直接子ノード。できるをそれしたい象のために正全体のドキュメントの奥行き検索する。
| 式 | 結果 |
|---|---|
| $..author | ドキュメント中すべての位置のauthor值 |
| $..price | すべてのprice值:[8.95, 12.99, 8.99, 22.99, 19.95] |
| $..book[2] | 第三本书,递归検索する |
| $..category | すべてのcategory值:["reference", "fiction", "fiction", "fiction"] |
再帰的降下演算子であなた不知っている所需データの精密に路径,または同じの键出今多个嵌套レイヤー时特にあり用。例えば,もしAPI対応で各種類嵌套レイヤーを含むid字段,$..idできる収集するすべてのid。
配列スライス
配列スライスさせるあなたから配列中選択する一系列元素。構文[start:end]選択するから起始インデックスまで(しかし不を含む)終了するインデックスの元素。支持する正インデックスと负インデックス。
| 式 | 結果 |
|---|---|
| $.store.book[0:2] | 前两本书(インデックス0と1) |
| $.store.book[1:3] | 第二と第三本书(インデックス1と2) |
| $.store.book[-1] | 最後に一本书(The Lord of the Rings) |
| $.store.book[-2:] | 最後に两本书 |
| $.store.book[:2] | 前两本书(同[0:2]) |
| $.store.book[2:] | 第三本书および後に |
注意する,切片行のためにで異なるJSONPath実装の間かもしれない略あり差异。上述構文従う大多数のストリーム行ライブラリとIETF RFC 9535標準使用の约定。
フィルタ式
フィルタ式はJSONPath真正变て強力のに方。それ们させるあなたに基づいて条件そして非位置選択する元素。フィルター構文使用[?(condition)],其中条件正各元素入行評価する。
比較演算子
JSONPathでフィルタ式中支持するもって下比較演算子:
| 演算子 | 意味 | 例 |
|---|---|---|
| == | など于 | [?(@.category == "fiction")] |
| != | 不など于 | [?(@.category != "fiction")] |
| < | 小于 | < 10)] |
| <= | 小于またはなど于 | <= 8.99)] |
| > | 大于 | [?(@.price > 15)] |
| >= | 大于またはなど于 | [?(@.price >= 12.99)] |
| =~ | 正すなわちマッチする(部分的に実装する) | [?(@.author =~ /Tolkien/i)] |
実用的なフィルタ例
使用私たちの例ドキュメント,もって下は实用のフィルタ式および其結果:
Find all books cheaper than $10:
< 10)]戻る书籍"Sayings of the Century"($8.95)と"Moby Dick"($8.99)。
Find all fiction books:
$.store.book[?(@.category == "fiction")]戻る三本书:"Sword of Honour"、"Moby Dick"と"The Lord of the Rings"。
Find books with an ISBN:
$.store.book[?(@.isbn)]戻るを持つisbn属性の书籍:"Moby Dick"と"The Lord of the Rings"。これはなぜならフィルター器確認する属性はいいえ存で。
Find the most expensive book:
$.store.book[?(@.price > 20)]戻る"The Lord of the Rings"($22.99)。
フィルタ内の論理演算子
あなたできる使用逻辑演算子コンポジット条件:
< 10 && @.category == "fiction")]
$.store.book[?(@.price > 15 || @.category == "reference")]第一つの式検索する10美元もって下の小说书籍(仅"Moby Dick")。第二个検索する超たことがある15美元または属于参照カテゴリの书籍(戻る"Sayings of the Century"と"The Lord of the Rings")。
JSONPath と XPath
JSONPath明確にもってXPathのためにモデル,两種類言語で概念上あり多くの類似点。もしあなた熟悉XML処理する,理解するこれ種類リレーションできるあり所ヘルプ。
| 機能 | JSONPath | XPath |
|---|---|---|
| ルート記号 | $ | / |
| 子アクセス | .keyまたは['key'] | /element |
| 配列インデックス | [0] | [1](から1開始する) |
| 通配符 | * | * |
| 再帰的降下 | .. | // |
| フィルター | [?(condition)] | [condition] |
| 属性 | 不適用可能(JSONない属性) | @attr |
| 現在のノード | @(でフィルター器中) | .またはcurrent() |
| 親 | 非対応 | .. |
| 軸 | 非対応 | 13个軸(ancestor、followingなど) |
| データモデル | オブジェクトと配列 | 元素、属性、文本ノード |
主な違いで于XPath操作するでを持つ元素、属性、文本ノード、命名する空间と処理するディレクティブの丰富树モデル上。JSONPath操作するでより簡単のオブジェクト(键值映射)と配列(番号付きリスト)モデル上。これ種類簡単性させるJSONPathより簡単学習,しかしで複雑クエリする側面不如XPath表达力強。
JSONPath実践
APIテスト
JSONPathに対してAPIテスト不可欠です。時にあなたへAPI送信するリクエストするかつ收まで大型JSON対応时,JSONPathさせるあなたできる断言特定值,そしてなし需手动ナビゲーション全体の结构。大多数のAPIテストツールネイティブサポートJSONPath。
例えば,でテストする中あなたかもしれない検証する第一本书の价格低于10美元:
// Using a JSONPath assertion in testing
response.jsonPath().get("store.book[0].price").should(equals(8.95));
// Find all books by a specific author
response.jsonPath().get("store.book[?(@.author == 'Herman Melville')].title");
// Returns: ["Moby Dick"]データ変換
時に統合する使用異なるデータフォーマットの系统时,JSONPathヘルプ提取と変換する特定字段。あなたできるから一つのJSON结构中提取值かつ映射まで另一つの,そしてなし需编写複雑の遍历コード。
構成管理
複雑の設定ファイル通常を含む奥行き嵌套のJSON。JSONPathさせるあなたできるクエリする特定設定する值,そしてなし需読み込むと解析する全体の结构。のようなjqこれ样のツール使用状況類似してJSONPathの構文でコマンドラインパイプライン中処理するJSON。
監視とアラート
で可观测性系统中,JSONPathクエリできるからJSONフォーマットのログとAPI対応中提取指標。あなたできる設定するでJSONPathクエリ戻る超たことがある阈值の值时トリガーするのアラート。
JSONPath実装
JSONPathほとんどで毎種類プログラミング言語中すべて利用可能。もって下は最も人気のライブラリ:
| 言語 | ライブラリ | インストールする |
|---|---|---|
| JavaScript | jsonpath-plus | npm install jsonpath-plus |
| Python | jsonpath-ng | pip install jsonpath-ng |
| Java | JsonPath (Jayway) | Maven: com.jayway.jsonpath |
| C# | Json.NET (Newtonsoft) | NuGet: Newtonsoft.Json |
| Go | gjson | go get github.com/tidwall/gjson |
| PHP | jsonpath | composer require softcreatr/jsonpath |
| Ruby | jsonpath | gem install jsonpath |
JavaScript例
< 10)]',
json: data
});
// Returns books with price < 10
Python Example
from jsonpath_ng import parse
data = { /* our sample JSON */ }
# Find all authors
author_expr = parse('$..author')
authors = [match.value for match in author_expr.find(data)]
# ["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J.R.R. Tolkien"]
# Find cheap books
cheap_expr = parse('$.store.book[?(@.price < 10)]')
cheap_books = [match.value for match in cheap_expr.find(data)]
Common Pitfalls and Tips
- Zero-based vs one-based indexing: JSONPath uses zero-based indexing (the first element is [0]), while XPath uses one-based indexing (the first element is [1]). This is a common source of off-by-one errors.
- Implementation differences: Before the IETF standard (RFC 9535), JSONPath implementations varied in their handling of edge cases like empty results, null values, and filter syntax. Always test your expressions with the specific library you are using.
- Filter performance: Recursive descent with filters (
$..book[?(@.price < 10)]) can be slow on large documents because it must traverse the entire tree. For performance-critical applications, use more specific paths when possible. - Case sensitivity: JSONPath is case-sensitive.
$.Storewill not match$.store. This is consistent with JSON's case-sensitive nature. - ゼロベースインデックスと1ベースインデックス:JSONPath使用ゼロベースインデックス(第一つの元素は[0]),そしてXPath使用1ベースインデックス(第一つの元素は[1])。これは差一間違いの常见ソース。
- 実装の違い:でIETF標準(RFC 9535)前に,JSONPath実装で処理する空結果、null值とフィルター構文など边缘情况时存で差异。常に使用あなた特定のライブラリテストする式。
よくある落とし穴と技巧
2024年,IETF公開するたRFC 9535,正式標準化たJSONPath。该仕様解决た各実装するの間存での多くの歧义と不一致。標準の閉键側面を含む:
- < 10)])で大型ドキュメント上かもしれないとても遅,なぜならそれ必須遍历全体の树。に対してパフォーマンス閉键の適用する,尽かもしれない使用より具体的の路径。
- 大文字小文字を区別:JSONPath区分大小写。$.Storeできないマッチする$.store。これとJSONの大文字小文字を区別性质一致。
- 特殊文字のエスケープ:もし键名を含む点または括号,必須使用带引号のブラケット記法:$['key.with.dots']そして非$.key.with.dots。
- 親ノードへのトラバース不可:とXPath異なる,JSONPathなし法ナビゲーションまで父ノード。ないXPathの..(父軸)のなど效项。JSONPathの..表示再帰的降下,そして非親。
もしあなたしている開始する一つの新規项目,优先選択する実装するRFC 9535のライブラリ,もって獲得する最大の互換性と予測可能の行のために。
必要とする高速クエリするJSONデータ?無料のオンラインJSONPathテストする器,リアルタイム针正あなたのJSONドキュメント評価する式。
試してみる JSONPath 検索する器IETF標準:RFC 9535
Python例
JSONPathは一種のJSONクエリする言語,類似して于XPath之于XML。それ使用路径式来ナビゲーションと提取JSONドキュメント中の特定值。のような$.store.book[0].titleこれ样のJSONPath式させるあなたできるで複雑の嵌套JSON结构中精確認する位データ,そしてなし需编写カスタマイズする解析するコード。
とはJSONPath?
JSONPath专のためにJSONのオブジェクトと配列结构設計する,そしてXPath专のためにXMLの元素と属性树設計する。JSONPath使用$として根ノード,ドット記法アクセスするオブジェクト,ブラケット記法アクセスする配列。XPath使用/入行路径分隔,@アクセスする属性。JSONPathより簡単しかし機能不如XPath丰富。
JSONPath と XPathあり何異なる?
JSONPath中の双点(..)は再帰的降下演算子。それでJSON结构のすべてのレイヤー検索する命名する键,そしてだけでなく仅は直接子ノード。例えば,$..author検索する全体のドキュメント中任意の位置のすべてのauthor键,にかかわらずそれ们嵌套多深。
JSONPath中の双点(..)とは何か意思?
<、><=、>< 10)]検索するすべての低于10美元の书籍。
JSONPathできるに基づいて条件フィルターデータか?
JSONPath最も初由Stefan Goessner于2007年提出,ない正式仕様,をもたらす各実装するの間存で差异。2024年,IETF公開するたRFC 9535正式標準化JSONPath。现代実装するしている趋同于此標準,しかしいくつかの较旧のライブラリかもしれない仍あり軽微の構文差异。