文章目录
在我们使用JSON input组件的时候,设置字段映射时,由于Kettle使用的是JSONPath组件来进行解析的,因此我们就需要了解他的相关语法
JSONPath是一个用于读取JSON的Java DSL操作库
GitHub:https://github.com/json-path/JsonPath
在线调试:http://jsonpath.herokuapp.com/
表示法
JSONPath表达式用于指定JSON结构元素(或一组元素)的路径.路径的表示法可以使用点表示,如下:
$.store.book[0].title
或者括号表示:
$['store']['book'][0]['title']
**$
**所代表的是JSON根路径,在使用时可以忽略.例如$.foobar.name
和foobar.name
所表达的意思是一样的,同理$[0].status
和[0].status
也一样
其他语法元素如下表:
表达式 | 说明 |
---|---|
$ |
根对象或者数组 |
.property |
选择父对象中指定的属性 |
[property] |
选择父对象中的指定属性。务必在属性名称周围加上单引号。 如果属性名称包含空格等特殊字符,或者以A…Za…z_以外的字符开头,请使用此表示法 |
[n] |
从数组中选择第n个元素。索引从0开始。 |
[index1,index2,…] |
选择具有指定索引的数组元素。返回一个集合列表。 |
..property |
递归查找:递归搜索指定的属性名称,并返回具有此属性名称的所有值的数组。即使只找到一个属性,也始终返回一个列表。 |
* |
通配符选择对象或数组中的所有元素,无论其名称或索引如何。例如,address.* 。*表示地址对象的所有属性,book [*] 表示书籍数组的所有项目 |
[start:end] or [start:] |
从起始索引中选择数组元素,最多但不包括结束索引。如果省略end,则从开始到数组结束选择所有元素。返回一个列表。 |
[:n] |
选择数组的前n个元素。返回一个列表。 |
[-n:] |
选择数组的最后n个元素。返回一个列表。 |
[?expression] |
过滤表达式。选择对象或数组中与指定过滤器匹配的所有元素。返回一个列表。 |
[(expression)] |
可以使用脚本表达式代替显式属性名称或索引。一个例子是[(@.length-1)] ,它选择数组中的最后一项。这里,length指的是当前数组的长度,而不是名为length的JSON字段。 |
@ |
在过滤器表达式中用于引用正在处理的当前节点。 |
注意:
- JSONPath表达式(包括属性名称和值)区分大小写。
- 与XPath不同,JSONPath没有用于从给定节点访问父节点或兄弟节点的操作。
过滤器
过滤器是用于过滤数组的逻辑表达式。带有过滤器的JSONPath表达式的示例
$.store.book[?(@.price < 10)]
其中@
表示当前正在处理的数组项或对象。过滤器也可以使用$
来引用当前对象之外的属性
$.store.book[?(@.price < $.expensive)]
只指定属性名称的表达式如[?(@.isbn)]
将匹配具有此属性的所有项目,无论值如何
此外,过滤器支持一下运算符
操作符 | 说明 |
---|---|
== |
等于,1和'1' 被认为是相等的,字符串值必须用单引号括起来(不是双引号):例如[?(@.color=='red')] |
!= |
不等于。字符串值必须用单引号括起来。 |
> |
大于 |
>= |
大于等于 |
< |
小于 |
<= |
小于等于 |
=~ |
匹配JavaScript正则表达式,例如[?(@.description=~ /cat.*/i)] 匹配描述以cat开头的项(不区分大小写) |
! |
用于否定,例如[?(!@.isbn)] 匹配没有isbn属性的项目 |
&& |
逻辑AND,用于组合多个过滤器表达式,例如:[?(@.category=='fiction' && @.price < 10 )] |
|| |
逻辑OR,用于组合多个过滤器表达式,例如:[?(@.category=='fiction' || @.price < 10 )] |
综合示例
目前我们有如下JSON结构:
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J.R.R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
在下面的例子中,$
符号是可选的,可以省略掉:
表达式 | 说明 |
---|---|
$.store.* |
store对象下所有的属性(非递归) |
$.store.bicycle.color |
获取得到color 属性的值,结果为red |
$.store..price $..price |
返回所有的price属性值集合,结果为[8.95,8.99,22.99,19.95] |
$.store.book[*] $..book[*] |
所有的book集合 |
$..book[*].title |
返回book对象下的所有标题集合 |
$..book[0] |
返回第一个book集合对象,结果为[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95}] |
$..book[0].title |
返回第一个book集合对象中的title属性,结果是Sayings of the Century |
$..book[0,1].title $..book[:2].title |
返回前2个book集合对象的title属性,结果是[Sayings of the Century, Moby Dick] |
$..book[-1:].title $..book[(@.length-1)].title |