第 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 项目页面。