python-json校驗(yàn)-jsonpath解析
背景
在進(jìn)行接口自動(dòng)化測(cè)試的時(shí)候,對(duì)響應(yīng)結(jié)果進(jìn)行校驗(yàn),基本上都是對(duì)json數(shù)據(jù)的校驗(yàn),響應(yīng)內(nèi)容十分復(fù)雜,當(dāng)然驗(yàn)證也是一個(gè)很龐大的工程 ,不過(guò)都是可以通過(guò)jsonpath 解決。
JSONPath 提供了強(qiáng)大的 JSON 解析功能,可以更便捷靈活的用來(lái)獲取對(duì)應(yīng)的 JSON 內(nèi)容。
表示法
JSONPath 有兩種表示方式, 可以使用點(diǎn)表示法,也可以使用括號(hào)表示法
- 點(diǎn)表示法 例子:$.store.book[0].title
- 括號(hào)表示法 例子:$['store']['book'][0]['title']
jsonpath的語(yǔ)法
語(yǔ)法 | 描述 |
---|---|
$ | 根對(duì)象/元素 |
@ | 當(dāng)前對(duì)象/元素 |
. 或者 [] | 子運(yùn)算符,匹配下級(jí)元素 |
.. | 遞歸下降,遞歸方式匹配所有子元素 |
* | 通配符。所有對(duì)象/元素,無(wú)論其名稱 |
[] | 下標(biāo)運(yùn)算符,jsonpath 從0開(kāi)始 |
[,] | 連接的操作符,多個(gè)結(jié)果拼接成列表返回 |
[開(kāi)始:結(jié)束:步驟] | 從 ES4 借來(lái)的數(shù)組切片運(yùn)算符。 |
?() | 應(yīng)用過(guò)濾器(腳本)表達(dá)式。 |
() | 腳本表達(dá)式,使用底層腳本引擎。 |
示例
{ "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 } } }
jsonpath | 結(jié)果 | 備注 |
---|---|---|
$.store.book[*].author | 所有書(shū)籍的作者 | |
$..author | 所有的作者 | |
$.store.* | 商店下的所有元素/對(duì)象,包括書(shū)籍和自行車 | |
$.store..price | 商店里所有元素/對(duì)象的價(jià)格 | |
$..book[2] | 下標(biāo)從0開(kāi)始,第3本書(shū) | |
$..book[(@.length-1)] | 按順序排列最后一本書(shū) | 用到了()和@兩個(gè)語(yǔ)法 |
$..book[-1:] | 按順序排列最后一本書(shū) | 用到了[]數(shù)組下標(biāo)切片 |
$..book[0,1] | 第1本書(shū)和第2本書(shū),前兩本書(shū) | |
$..book[:2] | 第1本書(shū)和第2本書(shū),前兩本書(shū) | $…book[0:2] ,從0開(kāi)始,0 1,前兩本書(shū) |
$..book[?(@.isbn)] | 有isbn字段的所有書(shū)籍 | |
$..book[?(@.price<10)] | 所有價(jià)格小于10的書(shū)籍 | |
$..* | json結(jié)構(gòu)的所有元素 |
實(shí)戰(zhàn)
安裝jsonpath
pip3 install jsonpath
以網(wǎng)上一個(gè)開(kāi)源的獲得天氣的API為例子:
def test_get_json(self): r = requests.get("http://t.weather.sojson.com/api/weather/city/101191102") print(r.text) r_json = r.json() # 用點(diǎn)方法來(lái)獲得notice的內(nèi)容 yesterday = jsonpath(r_json, "$.data.yesterday.notice") print(yesterday) # 獲得aqi=15 的forecast元素 aqi = jsonpath(r_json, "$..forecast[?(@.aqi==15)]") print(aqi)
當(dāng)不知道有jsonpath這個(gè)神器的時(shí)候,我是通過(guò)遍歷一個(gè)個(gè)元素,然后再去比對(duì)具體的字段信息,比如下方:獲得duration 超過(guò)7000 的api信息
{ "apis": [{ "path": "/path", "duration": 7890 }, { "path": "/path", "duration": 6890 }, { "path": "/path", "duration": 5890 }] }
通過(guò)遍歷的方式獲得:
apis = '{"apis":[{"path":"/path","duration":7890},{"path":"/path","duration":6890},{"path":"/path","duration":5890}]}' print(json.loads(apis)) apis_json = json.loads(apis) # 一個(gè)個(gè)遍歷 api_duration = [] for api in apis_json["apis"]: duration = api["duration"] if int(duration) > 7000: print(str(duration)) api_duration.append(api["path"]) print(api_duration)
通過(guò)jsonpath獲得
#jsonpath 更簡(jiǎn)單 api_duration2 = jsonpath(apis_json, "$.apis[?(@.duration>7000)].path") print(api_duration2)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python轉(zhuǎn)換wrf輸出的數(shù)據(jù)為網(wǎng)頁(yè)可視化json格式
這篇文章主要介紹了python轉(zhuǎn)換wrf輸出的數(shù)據(jù)為網(wǎng)頁(yè)可視化json格式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Django實(shí)戰(zhàn)之用戶認(rèn)證(初始配置)
這篇文章主要介紹了Django實(shí)戰(zhàn)之用戶認(rèn)證(初始配置),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07python實(shí)現(xiàn)ip地址的包含關(guān)系判斷
這篇文章主要介紹了python實(shí)現(xiàn)ip地址的包含關(guān)系判斷,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Python中內(nèi)置數(shù)據(jù)類型list,tuple,dict,set的區(qū)別和用法
這篇文章主要給大家介紹了Python中內(nèi)置數(shù)據(jù)類型list,tuple,dict,set的區(qū)別和用法,都是非?;A(chǔ)的知識(shí),十分的細(xì)致全面,有需要的小伙伴可以參考下。2015-12-12Python將CSV文件轉(zhuǎn)化為HTML文件的操作方法
很多朋友問(wèn)小編Python如何將CSV文件轉(zhuǎn)化為HTML文件,csv文件讀取怎么操作呢?帶著這些問(wèn)題一起通過(guò)本文學(xué)習(xí)吧2021-06-06FP-growth算法發(fā)現(xiàn)頻繁項(xiàng)集——構(gòu)建FP樹(shù)
常見(jiàn)的挖掘頻繁項(xiàng)集算法有兩類,一類是Apriori算法,另一類是FP-growth。Apriori通過(guò)不斷的構(gòu)造候選集、篩選候選集挖掘出頻繁項(xiàng)集,需要多次掃描原始數(shù)據(jù),當(dāng)原始數(shù)據(jù)較大時(shí),磁盤I/O次數(shù)太多,效率比較低下2021-06-06Selenium 配置啟動(dòng)項(xiàng)參數(shù)的方法
這篇文章主要介紹了Selenium 配置啟動(dòng)項(xiàng)參數(shù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python寫的創(chuàng)建文件夾自定義函數(shù)mkdir()
這篇文章主要介紹了Python寫的創(chuàng)建文件夾自定義函數(shù)mkdir(),文件夾操作是編程中經(jīng)常需要的,mkdir函數(shù)更是經(jīng)典中的經(jīng)典,需要的朋友可以參考下2014-08-08