JSONPathチュートリアル:複雑なJSONからデータを取り出す
APIレスポンスや大規模なJSONデータセットから特定の値を抽出したい場面は多いはずです。データ構造全体を手動でたどる代わりに、JSONPathを使えば必要なデータを正確に指定して取り出せます。このガイドではJSONPathの構文と実践的な使い方を解説します。
JSONPathとは?
JSONPathは、JSONデータから特定の要素を選択するためのクエリ言語です。XMLに対するXPathを参考に設計されており、複雑なJSON構造から効率的にデータを抽出できます。
基本構文
以下のJSONデータをサンプルとして使います。
{"store": {"books": [{"title": "Clean Code","author": "Robert C. Martin","price": 35.99,"tags": ["programming", "best-practices"]},{"title": "The Pragmatic Programmer","author": "David Thomas","price": 49.99,"tags": ["programming", "career"]},{"title": "Design Patterns","author": "Gang of Four","price": 54.99,"tags": ["programming", "architecture"]}],"location": "online"}}
ルート要素:$
すべてのJSONPath式は $(ルート)から始まります。
| 式 | 結果 |
|---|---|
$ | JSONドキュメント全体 |
$.store | storeオブジェクト全体 |
$.store.location | "online" |
ドット記法 vs ブラケット記法
$.store.books[0].title → ドット記法$['store']['books'][0]['title'] → ブラケット記法
どちらも同じ結果を返します。ドット記法の方が簡潔ですが、キーに特殊文字やスペースが含まれる場合はブラケット記法が必要です。
配列へのアクセス
| 式 | 説明 |
|---|---|
$.store.books[0] | 最初の本 |
$.store.books[-1] | 最後の本 |
$.store.books[0,2] | 1冊目と3冊目 |
$.store.books[0:2] | インデックス0〜1(スライス) |
ワイルドカードと再帰探索
ワイルドカード:*
すべての要素を選択します。
$.store.books[*].title→ ["Clean Code", "The Pragmatic Programmer", "Design Patterns"]
$.store.books[*].price→ [35.99, 49.99, 54.99]
再帰探索:..
すべての深さレベルで検索します。
$..title→ ["Clean Code", "The Pragmatic Programmer", "Design Patterns"]
$..price→ [35.99, 49.99, 54.99]
ネストの深さが不明な場合に再帰探索は便利ですが、大規模なデータセットではパフォーマンスに注意が必要です。
フィルター式
条件付き選択には ?() 構文を使います。
比較演算子
$.store.books[?(@.price > 40)]→ 価格が40より高い本$.store.books[?(@.price < 50)]→ 価格が50未満の本$.store.books[?(@.author == "David Thomas")]→ "David Thomas" 著の本
ここで @ は現在の要素を指します。
論理演算子
$.store.books[?(@.price > 40 && @.price < 55)]→ 価格が40〜55の間の本
実践的な使用例
APIレスポンスから特定フィールドを抽出
ユーザー一覧APIからメールアドレスのみを取り出す:
$.users[*].email
ネストされたオブジェクトから値を検索
設定ファイルからすべてのポート番号を取り出す:
$..port
条件によるデータフィルタリング
アクティブなユーザーのみを抽出する:
$.users[?(@.status == "active")]
配列の範囲選択
最新10件のログエントリを取得する:
$.logs[-10:]
JSONPath vs JavaScript
| タスク | JavaScript | JSONPath |
|---|---|---|
| 最初の本のタイトル | data.store.books[0].title | $.store.books[0].title |
| 全価格 | data.store.books.map(b => b.price) | $.store.books[*].price |
| 価格フィルター | data.store.books.filter(b => b.price > 40) | $.store.books[?(@.price > 40)] |
| 全タイトル(再帰) | 再帰関数が必要 | $..title |
JSONPathはコードを書かず宣言的にデータを抽出できるため、デバッグやデータ探索に特に役立ちます。
Tips と注意点
- パスをテストする: 複雑なJSONPath式は、JSONKitのQueryツールを使ってリアルタイムにテストしましょう。
- パフォーマンス:
..(再帰探索)は大きなJSONでは低速になることがあります。可能であれば明示的なパスを使いましょう。 - 実装の違い: JSONPathの構文は実装によって若干異なる場合があります。JSONKitは
jsonpath-plusライブラリを使用しています。 - 結果の型: JSONPathの結果は常に配列として返されます。単一の値を期待している場合でも、配列から取り出す処理が必要です。
まとめ
JSONPathをマスターすることで、複雑なJSON構造から高速かつ正確にデータを抽出できるようになります。JSONKitのJSONPath Queryツールを使って、クエリをリアルタイムでテストしながら結果をすぐに確認してみましょう。