jsonpath使用舉例

目錄

一、簡介

二、JSONPath語法元素和對應XPath元素的對比

三、jsonpath使用舉例

四、過濾器

五、在線解析器

參考


一、簡介

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

        接口返回:

[{
	"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]

$.[:2]

前面的兩個元素
  $.[?(@.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

五、在線解析器

http://jsonpath.com/

https://jsonpath.curiousconcept.com/

參考

https://goessner.net/articles/JsonPath/

https://www.cnblogs.com/aoyihuashao/p/8665873.html

https://blog.csdn.net/luxideyao/article/details/77802389

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章