JSONPathスクリプト式 — 動的な評価
パス内での動的な値計算のためのJSONPathスクリプト式について学びます。実装固有のスクリプト機能と制限を理解します。
Advanced
詳細な説明
JSONPathにおけるスクリプト式
スクリプト式は、JSONPathクエリ内に実行可能なコードを埋め込んで動的な計算を行うことを可能にします。括弧 () を使用して実行時に評価される式を囲み、単純な比較を超えた計算や変換を実現します。
構文
$.array[(@.length - 1)] // lengthを使った最後の要素
$.array[?(@.price * @.quantity > 100)] // 計算された条件
配列の長さへのアクセス
スクリプト式の最も一般的な使用法は、配列の長さへのアクセスです:
$.queue[(@.length - 1)]は最後の要素を返します — 実際の配列の長さに基づいて動的に計算されます。$.queue[(@.length - 2)]は最後から2番目を返します。
計算フィルタ
スクリプト式はフィルタ条件内で算術演算を実行できます:
$.orders[?(@.price * @.quantity > 100)] はデータ内にフィールドとして存在しない計算値に基づいてフィルタリングします。
実装の違い
スクリプト式のサポートは実装間で大きく異なります:
| 実装 | スクリプトサポート | 備考 |
|---|---|---|
| Jayway (Java) | 限定的 | フィルタ内の算術 |
| jsonpath-plus (JS) | 広範 | 完全なJavaScript式 |
| Python jsonpath-ng | 限定的 | 基本的な算術 |
| RFC 9535 | なし | 標準に含まれない |
セキュリティに関する考慮事項
スクリプト式はコードを実行するため、セキュリティリスクを導入する可能性があります。サーバーサイドアプリケーションでは:
- サニタイゼーションなしにユーザー提供のスクリプト式を許可しない。
- 動的なスクリプト構築よりも事前定義されたクエリを優先する。
- スクリプト式が必要な場合はサンドボックス化されたエバリュエータを使用する。
- インジェクション攻撃を防ぐために入力を検証する。
スクリプト式を使うべき場面
- フィルタ内での派生値の計算(合計、平均)
- 長さに基づく動的な配列位置へのアクセス
- クエリ内での複雑な文字列操作
ほとんどのユースケースでは、比較演算子を使った標準的なフィルタ式で十分であり、より移植性が高いです。
ユースケース
計算された合計(価格 x 数量)による注文のフィルタリング、動的に配列の最後のN要素へのアクセス、標準演算子では表現できないビジネスロジックをJSONPathクエリ内で適用するなどの高度なシナリオに使用します。