第 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>
Java 示例
以下 Java 示例演示了如何使用 jsonpath ()
DSL 命令选择特定价格范围内的项目:
from("queue:books.new") .choice() .when().jsonpath("$.store.book[?(@.price < 10)]") .to("jms:queue:book.cheap") .when().jsonpath("$.store.book[?(@.price < 30)]") .to("jms:queue:book.average") .otherwise() .to("jms:queue:book.expensive")
如果 JsonPath 查询返回空集,则结果将解释为 false
。这样,您可以将 JsonPath 查询用作 predicate。
XML 示例
以下 XML 示例演示了如何使用 jsonpath
DSL 元素在路由中定义 predicates:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:start"/> <choice> <when> <jsonpath>$.store.book[?(@.price < 10)]</jsonpath> <to uri="mock:cheap"/> </when> <when> <jsonpath>$.store.book[?(@.price < 30)]</jsonpath> <to uri="mock:average"/> </when> <otherwise> <to uri="mock:expensive"/> </otherwise> </choice> </route> </camelContext>
轻松语法
当您希望使用 jsonpath
语法定义基本 predicate 时,很难记住语法。例如,要找到所有 cheap book,您必须按如下方式编写语法:
$.store.book[?(@.price < 20)]
但是,如果您只可以写为:
store.book.price < 20
如果您只想查看具有价格键的节点,您也可以省略该路径:
price < 20
为了支持此功能,可以使用一个 EasyPredicateParser
,它用来使用基本风格来定义 predicate。这意味着 predicate 不得以 $
符号开头,且只能包含一个 Operator。简单语法如下:
left OP right
您可以在正确的 operator 中使用 Camel 简单语言,例如:
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
参数的一部分:
from("direct:start")
.choice()
// use true to suppress exceptions
.when().jsonpath("person.middlename", true
)
.to("mock:middle")
.otherwise()
.to("mock:other");
在 XML DSL 中,使用以下语法:
<route> <from uri="direct:start"/> <choice> <when> <jsonpath suppressExceptions="true">person.middlename</jsonpath> <to uri="mock:middle"/> </when> <otherwise> <to uri="mock:other"/> </otherwise> </choice> </route>
jsonpath 注入
在使用 bean 集成来调用 bean 方法时,您可以使用 JsonPath 从消息中提取值并将其绑定到方法参数。例如:
// Java public class Foo { @Consume(uri = "activemq:queue:books.new") public void doSomething(@JsonPath("$.store.book[*].author") String author, @Body String json) { // process the inbound message here } }
内联简单表达式
Camel 2.18 中的新功能.
Camel 支持 JsonPath
表达式中的内联 Simple
表达式。Simple
language insertions 必须以 Simple
语法表示,如下所示:
from("direct:start") .choice() .when().jsonpath("$.store.book[?(@.price < `${header.cheap}`)]") .to("mock:cheap") .when().jsonpath("$.store.book[?(@.price < `${header.average}`)]") .to("mock:average") .otherwise() .to("mock:expensive");
通过设置选项 allow
来关闭对 Simple 表达式的支持,如下所示。
Simple
=false
Java:
// Java DSL .when().jsonpath("$.store.book[?(@.price < 10)]", false, false)
XML DSL:
// XML DSL <jsonpath allowSimple="false">$.store.book[?(@.price < 10)]</jsonpath>
参考
有关 JsonPath 的更多详细信息,请参见 JSonPath 项目页面。