欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python-json校驗(yàn)-jsonpath解析

 更新時(shí)間:2022年11月19日 14:54:21   作者:雨水的早晨  
這篇文章主要介紹了python-json校驗(yàn)-jsonpath,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

背景

在進(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)文章

最新評(píng)論