python-json校驗-jsonpath解析
背景
在進行接口自動化測試的時候,對響應(yīng)結(jié)果進行校驗,基本上都是對json數(shù)據(jù)的校驗,響應(yīng)內(nèi)容十分復(fù)雜,當然驗證也是一個很龐大的工程 ,不過都是可以通過jsonpath 解決。
JSONPath 提供了強大的 JSON 解析功能,可以更便捷靈活的用來獲取對應(yīng)的 JSON 內(nèi)容。
表示法
JSONPath 有兩種表示方式, 可以使用點表示法,也可以使用括號表示法
- 點表示法 例子:$.store.book[0].title
- 括號表示法 例子:$['store']['book'][0]['title']
jsonpath的語法
| 語法 | 描述 |
|---|---|
| $ | 根對象/元素 |
| @ | 當前對象/元素 |
| . 或者 [] | 子運算符,匹配下級元素 |
| .. | 遞歸下降,遞歸方式匹配所有子元素 |
| * | 通配符。所有對象/元素,無論其名稱 |
| [] | 下標運算符,jsonpath 從0開始 |
| [,] | 連接的操作符,多個結(jié)果拼接成列表返回 |
| [開始:結(jié)束:步驟] | 從 ES4 借來的數(shù)組切片運算符。 |
| ?() | 應(yīng)用過濾器(腳本)表達式。 |
| () | 腳本表達式,使用底層腳本引擎。 |
示例
{ "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 | 所有書籍的作者 | |
| $..author | 所有的作者 | |
| $.store.* | 商店下的所有元素/對象,包括書籍和自行車 | |
| $.store..price | 商店里所有元素/對象的價格 | |
| $..book[2] | 下標從0開始,第3本書 | |
| $..book[(@.length-1)] | 按順序排列最后一本書 | 用到了()和@兩個語法 |
| $..book[-1:] | 按順序排列最后一本書 | 用到了[]數(shù)組下標切片 |
| $..book[0,1] | 第1本書和第2本書,前兩本書 | |
| $..book[:2] | 第1本書和第2本書,前兩本書 | $…book[0:2] ,從0開始,0 1,前兩本書 |
| $..book[?(@.isbn)] | 有isbn字段的所有書籍 | |
| $..book[?(@.price<10)] | 所有價格小于10的書籍 | |
| $..* | json結(jié)構(gòu)的所有元素 |
實戰(zhàn)
安裝jsonpath
pip3 install jsonpath
以網(wǎng)上一個開源的獲得天氣的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()
# 用點方法來獲得notice的內(nèi)容
yesterday = jsonpath(r_json, "$.data.yesterday.notice")
print(yesterday)
# 獲得aqi=15 的forecast元素
aqi = jsonpath(r_json, "$..forecast[?(@.aqi==15)]")
print(aqi)當不知道有jsonpath這個神器的時候,我是通過遍歷一個個元素,然后再去比對具體的字段信息,比如下方:獲得duration 超過7000 的api信息
{
"apis": [{
"path": "/path",
"duration": 7890
}, {
"path": "/path",
"duration": 6890
}, {
"path": "/path",
"duration": 5890
}]
}通過遍歷的方式獲得:
apis = '{"apis":[{"path":"/path","duration":7890},{"path":"/path","duration":6890},{"path":"/path","duration":5890}]}'
print(json.loads(apis))
apis_json = json.loads(apis)
# 一個個遍歷
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)
通過jsonpath獲得
#jsonpath 更簡單 api_duration2 = jsonpath(apis_json, "$.apis[?(@.duration>7000)].path") print(api_duration2)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)Keras搭建神經(jīng)網(wǎng)絡(luò)訓(xùn)練分類模型教程
這篇文章主要介紹了Python實現(xiàn)Keras搭建神經(jīng)網(wǎng)絡(luò)訓(xùn)練分類模型教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python中字符串轉(zhuǎn)換為列表的常用方法總結(jié)
本文將詳細介紹Python中將字符串轉(zhuǎn)換為列表的八種常用方法,每種方法都具有其獨特的用途和適用場景,文中的示例代碼講解詳細,感興趣的可以了解下2023-11-11
Django中的WebSocket實時通信的實現(xiàn)小結(jié)
在Django中,使用WebSocket可以實現(xiàn)實時通信,例如聊天應(yīng)用、實時更新等,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2024-05-05
pyspark創(chuàng)建DataFrame的幾種方法
為了便于操作,使用pyspark時我們通常將數(shù)據(jù)轉(zhuǎn)為DataFrame的形式來完成清洗和分析動作。那么你知道pyspark創(chuàng)建DataFrame有幾種方法嗎,下面就一起來了解一下2021-05-05
python自動化測試selenium核心技術(shù)處理彈框
這篇文章主要為大家介紹了python自動化測試selenium核心技術(shù)處理彈框的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
python3實現(xiàn)二叉樹的遍歷與遞歸算法解析(小結(jié))
這篇文章主要介紹了python3實現(xiàn)二叉樹的遍歷與遞歸算法解析(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2019-07-07

