如何快速获取json中的数据,也可以换一句话,如何简单快速的获取json文件中的数据,是我们在接口自动化中常考虑的内容,原因在于某些接口响应的数据是不同的,例如:一个查询接口会根据传参的不同,响应不同从值。有时候给出的json中含有data参数,有时候没有。当我们用固定的json位置取值时是不适用的,那么jsonpath和JMESPath就是一个不错的选择。
jsonpath:利用匹配的方式获取json文件中的数据。(我所掌握的方式,个人比较喜欢)
import jsonpath
def way():
json_demo = {
"error_code": 0,
"msg": "获取信息成功第一层",
"content": {
"data": [{
"id": 4001,
"name": "张三",
"age": "18",
"sex": "男",
"address": "山东省第三层市",
"phone": "18811221122"
},
{
"id": 4002,
"name": "李四",
"age": "18",
"sex": "女",
"address": "山东省第一层市",
"phone": "18811221123"
},
{
"id": 4003,
"name": "王五",
"age": "20",
"sex": "女",
"address": "山东省第二层市",
"phone": "18811221124"
}
],
"isSuccess": 1,
"msg": "获取信息成功第二层"
}
}
json1 = jsonpath.jsonpath(json_demo, '$..isSuccess')
json2 = jsonpath.jsonpath(json_demo, '$..msg')
json3 = jsonpath.jsonpath(json_demo, '$..address')
return json1, json2, json3
if __name__ == '__main__':
print(way())
如果你精通UI自动化,那么你一定会对xpath定位方式十分熟悉,可以对照xpath定位方式来记jsonpath的定位方式。(当然,我比较懒,不喜欢记,只会记住最常用的)
Xpath | JSONPath | 描述 |
---|---|---|
/ | $ | 跟节点位置 |
. | @ | 当前节点位置 |
/ | . or [] | 获取子节点位置 |
.. | .. | 选择所有符合条件的条件 |
* | * | 匹配所有元素节点 |
[] | [] | 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等) |
| | [,] | 支持迭代器中做多选 |
[] | ?() | 支持过滤操作 |
n/a | () | 支持表达式计算 |
JMESPath:同事推荐的,用起来也不错。
官方中文文档:https://www.osgeo.cn/jmespath/tutorial.html#filter-projections
感觉官方文档讲的非常好了,没有什么要补充说明的。
import jmespath
def way():
json_demo = {
"error_code": 0,
"msg": "获取信息成功第一层",
"content": {
"data": [{
"id": 4001,
"name": "张三",
"age": "18",
"sex": "男",
"address": "山东省第三层市",
"phone": "18811221122"
},
{
"id": 4002,
"name": "李四",
"age": "18",
"sex": "女",
"address": "山东省第一层市",
"phone": "18811221123"
},
{
"id": 4003,
"name": "王五",
"age": "20",
"sex": "女",
"address": "山东省第二层市",
"phone": "18811221124"
}
],
"isSuccess": 1,
"msg": "获取信息成功第二层"
}
}
json1 = jmespath.search("msg", json_demo)
json2 = jmespath.search("content.data[1].*", json_demo)
return json1, json2
if __name__ == '__main__':
print(way())