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 なし 標準に含まれない

セキュリティに関する考慮事項

スクリプト式はコードを実行するため、セキュリティリスクを導入する可能性があります。サーバーサイドアプリケーションでは:

  1. サニタイゼーションなしにユーザー提供のスクリプト式を許可しない
  2. 動的なスクリプト構築よりも事前定義されたクエリを優先する。
  3. スクリプト式が必要な場合はサンドボックス化されたエバリュエータを使用する。
  4. インジェクション攻撃を防ぐために入力を検証する。

スクリプト式を使うべき場面

  • フィルタ内での派生値の計算(合計、平均)
  • 長さに基づく動的な配列位置へのアクセス
  • クエリ内での複雑な文字列操作

ほとんどのユースケースでは、比較演算子を使った標準的なフィルタ式で十分であり、より移植性が高いです。

ユースケース

計算された合計(価格 x 数量)による注文のフィルタリング、動的に配列の最後のN要素へのアクセス、標準演算子では表現できないビジネスロジックをJSONPathクエリ内で適用するなどの高度なシナリオに使用します。

試してみる — JSON Path Evaluator

フルツールを開く