第21章 JsonPath
概要 リンクのコピーリンクがクリップボードにコピーされました!
JsonPath は、JSON メッセージの一部を抽出する際に便利な構文を提供します。JSON の構文は 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 | プレーンテキスト |
| Map |
メッセージボディーは |
| List | メッセージボディーは 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 プロジェクト のページを参照してください。