第21章 JsonPath
概要 リンクのコピーリンクがクリップボードにコピーされました!
JsonPath は、JSON メッセージの一部を抽出する際に便利な構文を提供します。JsonPath の構文は XPath に似ていますが、XML ドキュメントではなく、JSON メッセージから JSON オブジェクトを抽出するために使用されます。jsonpath
は式または述語 (空の結果がブール値として解釈される false
) として使用できます。
JsonPath パッケージの追加 リンクのコピーリンクがクリップボードにコピーされました!
Camel ルートで JsonPath を使用するには、以下のように camel-jsonpath
の依存関係をプロジェクトに追加する必要があります。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jsonpath</artifactId> <version>${camel-version}</version> </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jsonpath</artifactId>
<version>${camel-version}</version>
</dependency>
Java の例 リンクのコピーリンクがクリップボードにコピーされました!
以下の Java の例は、jsonpath()
DSL コマンドを使用して、特定の価格範囲内の商品を選択する方法を示しています。
JsonPath のクエリー結果が空のセットの場合、結果は false
と解釈されます。このため、JsonPath のクエリーを述語として使用することができます。
XML の例 リンクのコピーリンクがクリップボードにコピーされました!
以下の XML の例は、jsonpath
DSL の要素を使用してルート内で述語を定義する方法を示しています。
簡略化構文 リンクのコピーリンクがクリップボードにコピーされました!
jsonpath
の構文を使用して基本的な述語を定義する場合、構文を覚えるのが少し難しいかもしれません。たとえば、安価な本 (20 未満) をすべて検索する場合は、以下のような構文を書く必要があります。
$.store.book[?(@.price < 20)]
$.store.book[?(@.price < 20)]
しかし、以下のように簡略化した記述もできます。
store.book.price < 20
store.book.price < 20
さらに、価格キーを持つノードを確認する場合は、パスを省略することもできます。
price < 20
price < 20
この構文をサポートするために、EasyPredicateParser
を使用して基本的な記法で述語を定義します。つまり基本的な記法とは、述語を $
記号で始めてはならず、演算子が 1 つだけ含まれるようにすることです。簡略化構文は以下になります。
left OP right
left OP right
下記の例のように、right 部分には、Camel Simple 言語を使用することもできます。
store.book.price < ${header.limit}
store.book.price < ${header.limit}
サポートされるメッセージボディーのタイプ リンクのコピーリンクがクリップボードにコピーされました!
Camel JSonPath は、以下のタイプのメッセージボディーをサポートしています。
型 | 説明 |
---|---|
File | ファイルからの読み込み |
String | プレーンテキスト |
マップ |
メッセージボディーは |
リスト | メッセージボディーは java.util.List 型 |
|
任意。Jackson がクラスパス上にある場合、 |
|
上記のタイプがどれも一致しない場合、Camel はメッセージボディーを |
メッセージボディーがサポートされないタイプの場合は、デフォルトでは例外が出力されますが、JSonPath の設定で例外を抑止できます。
例外の抑制 リンクのコピーリンクがクリップボードにコピーされました!
jsonpath
式によって設定されたパスが見つからない場合、JSONPath は例外を出力します。SuppressExceptions
オプションを true に設定すると、例外を無視できます。たとえば、以下のコードで、jsonpath
パラメーターの一部として true オプションを追加します。
XML DSL では、以下の構文を使用します。
JsonPath の注入 リンクのコピーリンクがクリップボードにコピーされました!
Bean インテグレーションを使用して Bean メソッドを呼び出す場合、JsonPath を使用してメッセージから値を抽出し、それをメソッドパラメーターにバインドできます。以下に例を示します。
インライン Simple 式 リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.18 の新機能。
Camel は JsonPath
式でインライン Simple
式をサポートします。Simple
言語の挿入は、以下のように Simple
構文で記述する必要があります。
Simple
式のサポートを無効にするには、以下のようにオプション allowSimple=false
を設定します。
Java の場合
// Java DSL .when().jsonpath("$.store.book[?(@.price < 10)]", false, false)
// Java DSL
.when().jsonpath("$.store.book[?(@.price < 10)]", false, false)
XML DSL の場合
// XML DSL <jsonpath allowSimple="false">$.store.book[?(@.price < 10)]</jsonpath>
// XML DSL
<jsonpath allowSimple="false">$.store.book[?(@.price < 10)]</jsonpath>
リファレンス リンクのコピーリンクがクリップボードにコピーされました!
JsonPath の詳細については、JSonPath プロジェクト のページを参照してください。