kettle中json input中資料的解析
一、對於json資料的解析
簡介
- JSONPath - 是xpath在json的應用。
類似於XPath在xml文件中的定位,JsonPath表示式通常是用來路徑檢索或設定Json的。其表示式可以接受“dot–notation”和“bracket–notation”格式,例如$.store.book[0].title、$[‘store’][‘book’][0][‘title’]
- JSONPath 表示式
- JSONPaht 用一個抽象的名字$來表示最外層物件。
- 使用.符號:$.store.book[0].title
- 使用[]:$['store']['book'][0]['title']
- 陣列索引
1)JSONPath 允許使用萬用字元 * 表示所以的子元素名和陣列索引。還允許使用 '..' 從E4X參照過來的和陣列切分語法[start:end:step]
2
)
$.store.book[(@.length-1)].title
3)使用'@'符號表示當前的物件,?(<判斷表示式>) 使用邏輯表示式來過濾
$.store.book[?(@.price < 10)].title
二、JSONPath語法元素和對應XPath元素的對比
XPath |
JSONPath |
Description |
/ |
$ |
表示根元素 |
. |
@ |
當前元素 |
/ |
. or [] |
子元素 |
.. |
n/a |
父元素 |
// |
.. |
遞迴下降,JSONPath是從E4X借鑑的。 |
* |
* |
萬用字元,表示所有的元素 |
@ |
n/a |
屬性訪問字元 |
[] |
[] |
子元素操作符 |
| |
[,] |
連線操作符在XPath 結果合併其它結點集合。JSONP允許name或者陣列索引。 |
n/a |
[start:end:step] |
陣列分割操作從ES4借鑑。 |
[] |
?() |
應用過濾表示式 |
n/a |
() |
指令碼表示式,使用在指令碼引擎下面。 |
() |
n/a |
Xpath分組 |
三、jsonpath使用舉例
介面返回:
- [{
- "id": "PRIMARY",
- "name": "小學",
- "front_id": "PRIMARY",
- "front_name": "小學"
- }, {
- "id": "JUNIOR",
- "name": "初中",
- "front_id": "JUNIOR",
- "front_name": "初中"
- }, {
- "id": "HIGH",
- "name": "高中",
- "front_id": "HIGH",
- "front_name": "高中"
- }, {
- "id": "TECHNICAL",
- "name": "中專/技校",
- "front_id": "TECHNICAL",
- "front_name": "中專/技校"
- }, {
- "id": "COLLEGE",
- "name": "大專",
- "front_id": "COLLEGE",
- "front_name": "大專"
- }, {
- "id": "BACHELOR",
- "name": "本科",
- "front_id": "BACHELOR",
- "front_name": "本科"
- }, {
- "id": "MASTER",
- "name": "碩士",
- "front_id": "MASTER",
- "front_name": "碩士"
- }, {
- "id": "DOCTOR",
- "name": "博士",
- "front_id": "DOCTOR",
- "front_name": "博士"
- }]
JSONPath |
結果 |
|
|
所有學歷的name |
|
|
所有的id |
|
|
所有元素 |
|
|
倒數第二個元素的name |
|
|
第三個元素 |
|
|
最後一個元素 |
|
|
前面的兩個元素 |
|
|
過濾出所有的name包含“中”的書。 |
|
|
過濾出價格低於10的書。 |
|
|
所有元素的個數 |
介面返回:
- {
- "store": {
- "book": [
- {
- "category": "reference",
- "author": "Nigel Rees",
- "title": "Sayings of the Century",
- "price": 8.95
- },
- {
- "category": "fiction",
- "author": "Evelyn Waugh",
- "title": "Sword of Honour",
- "price": 12.99
- },
- {
- "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
- }
JsonPath表示式 |
結果 |
$.store.book[*].author |
[ |
$.store.* 顯示所有葉子節點值 |
[ |
$.store..price |
[ |
$..book[0,1] |
[ |
$..book[-2:] |
獲取最後兩本書 |
$..book[2:] |
[ |
$..book[?(@.isbn)] |
所有具有isbn屬性的書 |
$.store.book[?(@.price < 10)] |
所有價格小於10的書 |
$..book[?(@.price <=$[‘expensive’])] |
所有價格低於expensive欄位的書 |
$..book[?(@.author =~ /.*REES/i)] |
所有符合正則表示式的書 |
$..* |
返回所有 |
$..book.length() |
[ |
四、過濾器
操作符 |
描述 |
== |
等於符號,但數字1不等於字元1(note that 1 is not equal to ‘1’) |
!= |
不等於符號 |
< |
小於符號 |
<= |
小於等於符號 |
> |
大於符號 |
>= |
大於等於符號 |
=~ |
判斷是否符合正則表示式,例如[?(@.name =~ /foo.*?/i)] |
in |
所屬符號,例如[?(@.size in [‘S’, ‘M’])] |
nin |
排除符號 |
size |
size of left (array or string) should match right |
empty |
判空符號 |
例如:
1)所有具有isbn屬性的書
$.store.book[?(@.isbn)].author
2)所有價格大於10的書
$.store.book[?(@.price >
10)]
3)查詢xxx==3的所有物件
$.result.list[?(@.xxx ==3)]
4)可以自定義過濾器來獲取想要的任何元素,可以多條件查詢
五、線上解析器
https://jsonpath.curiousconcept.com/
在這裡,你可以將你的json格式的資料拷貝上去,自己手動寫表示式解析檢視。