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提取字段,但是不完全支持,存在以下问题

现在又多了一个问题

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))
上一篇 下一篇

猜你喜欢

热点阅读