第 21 章 JsonPath


概述

JsonPath 语言提供了一种方便的语法,用于提取 JSON 消息的部分。JSON 的语法类似于 XPath,但它用于从 JSON 消息中提取 JSON 对象,而不是在 XML 上操作。jsonpath DSL 命令可用作表达式或谓词(其中,一个空结果解释为布尔值 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 时,难以记住语法。例如,要找出所有便宜的图书,您必须按照如下所示编写语法:

$.store.book[?(@.price < 20)]

但是,如果您可以将其写成:

store.book.price < 20

如果只想查看具有价格键的节点,您也可以省略该路径:

price < 20

为了支持这一支持,有一个 EasyPredicateParser,它用来使用基本样式定义 predicate。这意味着 predicate 不得以 $ 符号开头,且必须仅包含一个运算符。简单的语法如下:

left OP right

您可以在正确的 Operator 中使用 Camel 简单语言,例如:

store.book.price < ${header.limit}

支持的消息正文类型

Camel JSonPath 使用以下类型支持消息正文:

类型描述

File

从文件读取

字符串

普通字符串

map

本质上正文作为 java.util.Map 类型

list

消息正文作为 java.util.List 类型

POJO

可选 If Jackson 位于类路径上,然后 camel-jsonpath 可以使用 Jackson 将消息正文读取为 POJO 并转换为 java.util.Map,后者受到 JSonPath 的支持。例如,您可以添加 camel-jackson 作为依赖项,以包含 Jackson。

InputStream

如果以上类型都不匹配,则 Camel 将试图将消息正文读取为 java.io.InputStream

如果消息正文是不受支持的类型,则默认会抛出异常,但您可以将 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 表达式。简单 语言插入必须以 简单 语法表达,如下所示:

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");

通过设置 选项允许 Simple =false 关闭对 Simple 表达式的支持,如下所示。

Java:

// Java DSL
.when().jsonpath("$.store.book[?(@.price < 10)]", false, false)

XML DSL:

// XML DSL
<jsonpath allowSimple="false">$.store.book[?(@.price &lt; 10)]</jsonpath>

参考

有关 JsonPath 的详情,请查看 JSonPath 项目页面

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.