python之jsonpath的简单使用

1.使用场景

有时候一个接口可能不满足业务的整个流程逻辑,需要多个接口配合使用,简单的案例如:B 接口的成功调用依赖于 A 接口,需要在 A 接口的响应数据(response)中拿到需要的字段,在调用 B 接口的时候,传递给 B 接口作为 B 接口请求参数,拿到后续响应的响应数据。
举例:

A接口登录成功之后,得到response如下:

{'code':1,'msg':'登录成功',"data":{"id":123,"token":"HJdnjajkajjmhhhfd#3ll"}}

B接口要进行充值需要拿到A接口的id和token值作为B接口的请求数据,此时就需要使用到jsonpath,当然也有其他方式。

2.介绍jsonpath

2.1安装:pip install jsonpath,官网:https://goessner.net/articles/JsonPath/

2.2 jsonpath的运算符

 

存在以下数据:

data = { "store":{
       "book":[
      { "category":"参考",
         "author":"Nigel Rees",
         "title":"世纪风俗",
         "price":8.95
      },
      { "category":"小说",
         "author":"Evelyn Waugh",
         "title":"荣誉剑",
         "price":12.99
      },
      { "category":"小说",
         "author":"Herman Melville",
         "title":"Moby Dick",
         "isbn":"0-553-21311-3",
         "price":8.99
      },
      { "category":"小说",book
         "author":"JRR Tolkien",
         "title":"指环王",
         "isbn":"0-395-19395-8",
         "price":22.99
      }
    ],
    "bicycle":{
       "color":"red",
       "price":19.95
    }
  }
}
获取store中所有的book的author $.store.book[*].author
获取所有的author $..author
获取store下的所有price $.store..price
获取book下的第三个值 $..book[2]
获取book下的倒数第一个值

$..book[(@.length-1)]

$..book[-1:]

获取book下的前两个值 $..book[0,1]
获取book中包含isbn字段

$..book[?(@.isbn)]

获取book中价格小于10

$..book[?(@.price<10)]

 

2.3 python中使用方法

from jsonpath import jsonpath
jsonpath(data, '$..author')

2.4 使用jsonpath封装函数,提取到需要传给下一个接口的数据

将需要传给下个接口的参数放入到Excel表格中extract列中,使用列表存放起来,如:[["normal_mobile_phone","$..mobile_phone"]]

    def __extract_data_from_json(self):
        try:
            # 将Excel表格中的数据转换为python对象
            rules = json.loads(self.case['extract'])
        except Exception as e:
            logger.exception('用例【{}】的extract字段数据:{}格式不正确'.format(self.case['title'], self.case['extract']))
            raise e
        # 循环取值
        for rule in rules:
            name = rule[0]  # 参数名
            exp = rule[1]  # jsonpath表达式
            value = jsonpath(self.response.json(), exp)  # 在响应数据中去提取数据
            if value:
                # 注意:如果提取到了值是一个列表格式
                # 如果提取到了数据就绑定到类属性中
                setattr(self.__class__, name, value[0])
            else:
                logger.exception('用例【{}】的提取表达式{}提取不到数据'.format(self.case['title'], self.case['extract']))

    def __extract_data(self):
        if self.case.get('extract'):
            if self.case['res_type'].lower() == 'json':
                self.__extract_data_from_json()
posted @ 2021-08-16 19:01  大头~~  阅读(891)  评论(0编辑  收藏  举报