目錄
一、簡介
- 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 |
所有學歷的name |
|
$.[*].id |
所有的id |
|
$.[*] |
所有元素 |
|
$.[(@.length-2)].name |
倒數第二個元素的name |
|
$.[2] |
第三個元素 |
|
$.[(@.length-1)] |
最後一個元素 | |
$.[0,1]
|
前面的兩個元素 | |
$.[? (@.name =~ /.*中/i)] |
過濾出所有的name包含“中”的書。 | |
$..book[?(@.price<10)] |
過濾出價格低於10的書。 | |
$.[*]. length() |
所有元素的個數 |
接口返回:
{
"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 或 $..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)可以自定義過濾器來獲取想要的任何元素,可以多條件查詢
https://testerhome.com/topics/6681
五、在線解析器
https://jsonpath.curiousconcept.com/
參考
https://goessner.net/articles/JsonPath/