第 21 章 JsonPath
概述 复制链接链接已复制到粘贴板!
JsonPath 语言提供便捷的语法,用于提取 JSON 消息的部分。JSON 的语法与 XPath 类似,但它用于从 JSON 消息中提取 JSON 对象,而不是对 XML 执行操作。jsonpath
DSL 命令可用作表达式或 predicate (空结果被解释为布尔值 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 查询用作 predicate。
XML 示例 复制链接链接已复制到粘贴板!
以下 XML 示例演示了如何使用 jsonpath
DSL 元素在路由中定义 predicates:
轻松语法 复制链接链接已复制到粘贴板!
当您希望使用 jsonpath
语法定义基本 predicate 时,很难记住语法。例如,要找到所有 cheap book,您必须按如下方式编写语法:
$.store.book[?(@.price < 20)]
$.store.book[?(@.price < 20)]
但是,如果您只可以写为:
store.book.price < 20
store.book.price < 20
如果您只想查看具有价格键的节点,您也可以省略该路径:
price < 20
price < 20
为了支持此功能,可以使用一个 EasyPredicateParser
,它用来使用基本风格来定义 predicate。这意味着 predicate 不得以 $
符号开头,且只能包含一个 Operator。简单语法如下:
left OP right
left OP right
您可以在正确的 operator 中使用 Camel 简单语言,例如:
store.book.price < ${header.limit}
store.book.price < ${header.limit}
支持的消息正文类型 复制链接链接已复制到粘贴板!
Camel JSonPath 支持使用以下类型的消息正文:
类型 | 描述 |
---|---|
File | 从文件中读取 |
字符串 | 普通字符串 |
Map |
essage body as |
list | 消息正文为 java.util.List 类型 |
|
可选的 If Jackson 位于 classpath 上,则 |
|
如果以上类型都不匹配,则 Camel 会尝试将消息正文读取为 |
如果消息正文是不支持的类型,则默认抛出异常,但您可以配置 JSonPath 以抑制异常。
阻止例外 复制链接链接已复制到粘贴板!
如果没有找到由 jsonpath
表达式配置的路径,则 jsonpath 会抛出异常。通过将 SuppressExceptions
选项设置为 true 可忽略异常。例如,在下面的代码中,添加 true 选项作为 jsonpath
参数的一部分:
在 XML DSL 中,使用以下语法:
jsonpath 注入 复制链接链接已复制到粘贴板!
在使用 bean 集成来调用 bean 方法时,您可以使用 JsonPath 从消息中提取值并将其绑定到方法参数。例如:
内联简单表达式 复制链接链接已复制到粘贴板!
Camel 2.18 中的新功能.
Camel 支持 JsonPath
表达式中的内联 Simple
表达式。Simple
language insertions 必须以 Simple
语法表示,如下所示:
通过设置选项 allow
来关闭对 Simple 表达式的支持,如下所示。
Simple
=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 项目页面。