Python-jmespath学习
2021-07-28 本文已影响0人
冲锋丘丘人
过滤器-指定字段等于number整数
官方文档介绍的是指定字段等于string字符串status=="running"
,但是实际上我遇到的数据是number整数类型,如下data数据就是接口返回的数据,我想筛选exchange_type==13
的数据,刚开始是这么写的[?exchange_type==13]
,也试了[?exchange_type=='13']
,结果是报错或者是数据为空。
正确的写法是"data.exchange_config_list[?exchange_type==`13`]"
,注意不是单引号也不是双引号。
过滤器-比较指定字段
[?already_exchange_num<most_exchange_num]
import jmespath, json
data = {"code": 200, "data": {"base_rsp": {"ret": 0, "rsp_msg": "", "seq": 0}, "exchange_config_list": [
{"already_exchange_num": 1, "exchange_id": 30217, "exchange_type": 13, "expired_day": 0, "fragments_num": 1,
"fragments_type": 1, "most_exchange_num": 1, "weight": 10000},
{"already_exchange_num": 485, "exchange_id": 90124, "exchange_type": 1, "expired_day": 10, "fragments_num": 3,
"fragments_type": 2, "most_exchange_num": 99999, "weight": 999},
{"already_exchange_num": 0, "exchange_id": 30174, "exchange_type": 13, "expired_day": 0, "fragments_num": 6570,
"fragments_type": 1, "most_exchange_num": 2, "weight": 1}]}, "elapsed_time": 7, "message": "请求成功", "ret": 0}
#过滤器,注意语法,同时使用number是需要``符号,官方文档用的是字符串
a = jmespath.search("data.exchange_config_list[?exchange_type==`1`]", data)
aa = jmespath.search("data.exchange_config_list[?exchange_type==`1` && weight==`1`]", data) #多条件过滤
#比较两个字段值的大小
b = jmespath.search("[?already_exchange_num<most_exchange_num]", a)
#jmespath内置方法,注意上下两个写法,返回一个对象or一个列表
d = jmespath.search("[min_by(@, &fragments_num)]", b)
数字作为key值,keys和values方法取字典的键值
import jmespath
my_list = {
"code": 200,
"data": {
"base_rsp": {
"ret": 0,
"rsp_msg": "",
"seq": 0
},
"uid_follow_status_map": {
"17230530": 1
}
},
"elapsed_time": 9,
"message": "\u8bf7\u6c42\u6210\u529f",
"ret": 0
}
print(jmespath.search('data.uid_follow_status_map."17230530"', my_list)) #数字作为键值,需要用双引号,且单引号在外边
print(jmespath.search('values(data.uid_follow_status_map)|[0]', my_list)) #取字典的key或者value值,使用values方法和keys方法
##输出
1
1
管道符|
语法
jmespath.search('values(data.uid_follow_status_map)|[0]', my_list) #取列表第n个值
反转列表
httprunner项目使用jmespath提取字段,但是不完全支持,存在以下问题
- 表达式不能格式化传参:
body.data.bbs_id_list[?exchange_type={}].formmat(type)
现在又多了一个问题
- 不支持负数列表切片取后面的数,如
body.data.bbs_id_list[-1]
,这个在httprunner执行提取不了数据,在Python执行环境时正常的。
可以用reverse
方法进行列表反转
print(jmespath.search('data.bbs_id_list[]', data))
print(jmespath.search('reverse(data.bbs_id_list[])', data))
print(jmespath.search('reverse(data.bbs_id_list[])|[0]', data))