第 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>
<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 时,难以记住语法。例如,要找出所有便宜的图书,您必须按照如下所示编写语法:
			
$.store.book[?(@.price < 20)]
$.store.book[?(@.price < 20)]
但是,如果您可以将其写成:
store.book.price < 20
store.book.price < 20
如果只想查看具有价格键的节点,您也可以省略该路径:
price < 20
price < 20
				为了支持这一支持,有一个 EasyPredicateParser,它用来使用基本样式定义 predicate。这意味着 predicate 不得以 $ 符号开头,且必须仅包含一个运算符。简单的语法如下:
			
left OP right
left OP right
您可以在正确的 Operator 中使用 Camel 简单语言,例如:
store.book.price < ${header.limit}
store.book.price < ${header.limit}
支持的消息正文类型 复制链接链接已复制到粘贴板!
Camel JSonPath 使用以下类型支持消息正文:
| 类型 | 描述 | 
|---|---|
|   File  |   从文件读取  | 
|   字符串  |   普通字符串  | 
|   map  |   
								本质上正文作为   | 
|   list  |   消息正文作为 java.util.List 类型  | 
|   
								  |   
								可选 If Jackson 位于类路径上,然后   | 
|   
								  |   
								如果以上类型都不匹配,则 Camel 将试图将消息正文读取为   | 
如果消息正文是不受支持的类型,则默认会抛出异常,但您可以将 JSonPath 配置为抑制异常。
抑制例外 复制链接链接已复制到粘贴板!
				如果没有找到 jsonpath 表达式配置的路径,JSONPath 将抛出异常。通过将 SuppressExceptions 选项设置为 true,可忽略异常。例如,在以下代码中添加 true 选项作为 jsonpath 参数的一部分:
			
在 XML DSL 中,使用以下语法:
JSONPath 注入 复制链接链接已复制到粘贴板!
在使用 bean 集成调用 bean 方法时,您可以使用 JsonPath 从消息中提取值并将其绑定到方法参数。例如:
内联简单表达式 复制链接链接已复制到粘贴板!
Camel 2.18 中的新功能.
				Camel 在 JsonPath 表达式中支持内联   表达式。Simple 简单 语言插入必须以 简单 语法表达,如下所示:
			
				通过设置 选项允许 Simple =false 关闭对 Simple 表达式的支持,如下所示。
			
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 项目页面。