第 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 键查看节点,您也可以省略该路径:
price < 20
price < 20
要支持此功能,有一个 EasyPredicateParser
,用于定义使用基本风格的 predicate。这意味着 predicate 不得以 $
符号开头,且必须仅包含一个操作器。简单语法如下:
left OP right
left OP right
您可以在右侧运算符中使用 Camel 简单语言,例如:
store.book.price < ${header.limit}
store.book.price < ${header.limit}
支持的消息正文类型 复制链接链接已复制到粘贴板!
Camel JSonPath 支持使用以下类型的消息正文:
类型 | 描述 |
---|---|
File | 从文件读取 |
字符串 | 普通字符串 |
Map |
essage 正文作为 |
list | 消息正文为 java.util.List 类型 |
|
可选,如果 Jackson 位于 classpath 上,则 |
|
如果上述类型都不匹配,则 Camel 将尝试以 |
如果消息正文是不支持的类型,则默认抛出异常,但您可以将 JSonPath 配置为阻止异常。
suppress Exceptions 复制链接链接已复制到粘贴板!
如果没有找到 jsonpath
表达式配置的路径,则 jsonpath 将抛出异常。通过将 SuppressExceptions
选项设置为 true 可忽略异常。例如,在以下代码中,将 true 选项添加为 jsonpath
参数的一部分:
在 XML DSL 中,使用以下语法:
jsonpath 注入 复制链接链接已复制到粘贴板!
在使用 bean 集成来调用 bean 方法时,您可以使用 JsonPath 从消息中提取值,并将它绑定到 method 参数。例如:
内联简单表达式 复制链接链接已复制到粘贴板!
Camel 2.18 中的新功能.
Camel 支持 JsonPath
表达式中的内联 简单
表达式。Simple
语言插入必须使用 简单
语法表示,如下所示:
通过设置选项 allow
来关闭对简单表达式的支持,如下所示。
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 项目页面。