1. 程式人生 > 實用技巧 >kettle中json input中資料的解析

kettle中json input中資料的解析

一、對於json資料的解析

簡介

  • JSONPath - 是xpath在json的應用。

類似於XPath在xml文件中的定位,JsonPath表示式通常是用來路徑檢索或設定Json的。其表示式可以接受“dot–notation”和“bracket–notation”格式,例如$.store.book[0].title、$[‘store’][‘book’][0][‘title’]

  • JSONPath 表示式
  1. JSONPaht 用一個抽象的名字$來表示最外層物件。
  2. 使用.符號:$.store.book[0].title
  3. 使用[]:$['store']['book'][0]['title']
  4. 陣列索引

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使用舉例

介面返回:

  1. [{
  2. "id": "PRIMARY",
  3. "name": "小學",
  4. "front_id": "PRIMARY",
  5. "front_name": "小學"
  6. }, {
  7. "id": "JUNIOR",
  8. "name": "初中",
  9. "front_id": "JUNIOR",
  10. "front_name": "初中"
  11. }, {
  12. "id": "HIGH",
  13. "name": "高中",
  14. "front_id": "HIGH",
  15. "front_name": "高中"
  16. }, {
  17. "id": "TECHNICAL",
  18. "name": "中專/技校",
  19. "front_id": "TECHNICAL",
  20. "front_name": "中專/技校"
  21. }, {
  22. "id": "COLLEGE",
  23. "name": "大專",
  24. "front_id": "COLLEGE",
  25. "front_name": "大專"
  26. }, {
  27. "id": "BACHELOR",
  28. "name": "本科",
  29. "front_id": "BACHELOR",
  30. "front_name": "本科"
  31. }, {
  32. "id": "MASTER",
  33. "name": "碩士",
  34. "front_id": "MASTER",
  35. "front_name": "碩士"
  36. }, {
  37. "id": "DOCTOR",
  38. "name": "博士",
  39. "front_id": "DOCTOR",
  40. "front_name": "博士"
  41. }]

JSONPath

結果

$.[*].name

所有學歷的name

$.[*].id

所有的id

$.[*]

所有元素

$.[(@.length-2)].name

倒數第二個元素的name

$.[2]

第三個元素

$.[(@.length-1)]

最後一個元素

$.[0,1]

$.[:2]

前面的兩個元素

$.[?(@.name =~ /.*中/i)]

過濾出所有的name包含“中”的書。

$..book[?(@.price<10)]

過濾出價格低於10的書。

$.[*].length()

所有元素的個數

介面返回:

  1. {
  2. "store": {
  3. "book": [
  4. {
  5. "category": "reference",
  6. "author": "Nigel Rees",
  7. "title": "Sayings of the Century",
  8. "price": 8.95
  9. },
  10. {
  11. "category": "fiction",
  12. "author": "Evelyn Waugh",
  13. "title": "Sword of Honour",
  14. "price": 12.99
  15. },
  16. {
  17. "category": "fiction",
  18. "author": "Herman Melville",
  19. "title": "Moby Dick",
  20. "isbn": "0-553-21311-3",
  21. "price": 8.99
  22. },
  23. {
  24. "category": "fiction",
  25. "author": "J. R. R. Tolkien",
  26. "title": "The Lord of the Rings",
  27. "isbn": "0-395-19395-8",
  28. "price": 22.99
  29. }
  30. ],
  31. "bicycle": {
  32. "color": "red",
  33. "price": 19.95
  34. }
  35. },
  36. "expensive": 10
  37. }

JsonPath表示式

結果

$.store.book[*].author

$..author

[
“Nigel Rees”,
“Evelyn Waugh”,
“Herman Melville”,
“J. R. R. Tolkien”
]

$.store.* 顯示所有葉子節點值

[
[
{
”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
}
],
{
”color” : “red”,
”price” : 19.95
}
]

$.store..price

[
8.95,
12.99,
8.99,
22.99,
19.95
]

$..book[0,1]

$..book[:2]

[
{
”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
}
]

$..book[-2:]

獲取最後兩本書

$..book[2:]

[
{
”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
}
]

$..book[?(@.isbn)]

所有具有isbn屬性的書

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

所有價格小於10的書

$..book[?(@.price <=$[‘expensive’])]

所有價格低於expensive欄位的書

$..book[?(@.author =~ /.*REES/i)]

所有符合正則表示式的書
[
{
”category” : “reference”,
”author” : “Nigel Rees”,
”title” : “Sayings of the Century”,
”price” : 8.95
}
]

$..*

返回所有

$..book.length()

[
4
]

四、過濾器

操作符

描述

==

等於符號,但數字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)可以自定義過濾器來獲取想要的任何元素,可以多條件查詢

五、線上解析器

http://jsonpath.com/

https://jsonpath.curiousconcept.com/

在這裡,你可以將你的json格式的資料拷貝上去,自己手動寫表示式解析檢視。