python接口自动化33-json解析神器jsonpath

前言

做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言。
当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间,于是就有了 jsonpath 解析库,专门解决 json 路径深,取值难的问题。

字典取值

对接口返回的接口,转成 dict 类型,通过字典键值对取值

# 作者-上海悠悠 QQ交流群:717225969
# 返回结果,这里是dict
result = {
"code": 0,
"data": [
{
"age": 20,
"create_time": "2019-09-15",
"id": 1,
"mail": "283340479@qq.com",
"name": "yoyo",
"sex": "M"
},
{
"age": 21,
"create_time": "2019-09-16",
"id": 2,
"mail": "123445@qq.com",
"name": "yoyo111",
"sex": "M"
}
],
"msg": "success!"
}

# 字典取值断言
assert result["code"] == 0
assert result["msg"] == "success!"
assert result["data"][0]["name"] == "yoyo"

当层级越来越深的时候,会发现取值变得困难,并且list里面的内容往往不知道是第几个
比如我想判断返回的结果里面有没有 "name": "yoyo" 并且你不知道它是 data 列表中的第几个,这种情况断言就写的很复杂了

正则取值

比如我想判断返回的结果里面有没有 "name": "yoyo" 并且你不知道它是 data 列表中的第几个,这种情况断言就写的很复杂了。
可以用万能的正则取值,正则只能是针对字符串取值,dict 对象先转 json 字符串。

import re
import json
# 作者-上海悠悠 QQ交流群:717225969

# 返回结果,这里是dict
result = {
"code": 0,
"data": [
{
"age": 20,
"create_time": "2019-09-15",
"id": 1,
"mail": "283340479@qq.com",
"name": "yoyo",
"sex": "M"
},
{
"age": 21,
"create_time": "2019-09-16",
"id": 2,
"mail": "123445@qq.com",
"name": "yoyo111",
"sex": "M"
}
],
"msg": "success!"
}

# 断言data中包含"name": "yoyo"
result_to_json = json.dumps(result)
print(result_to_json) # 先转json
# 方法1 正则取值
res = re.findall('"name": "(.+?)"', result_to_json) # 正则从json中取值
print(res)
assert "yoyo" in res

# 方法2 直接判断包含
assert '"name": "yoyo"' in result_to_json

jsonpath 解析

接下来讲一个非常强大并且方便的 jsonpath 专门用于 json 解析,解决路径深的老大难问题!
先安装依赖包

pip install jsonpath

学习jsonpath 不得不提到xpath,这两者之间的语法是差不多的

Xpath JSONPath 描述
/ $ 跟节点
. @ 现行节点
/ . or [] 取子节点
.. n/a 取父节点 JsonPath不支持
// .. 相对节点 就是不管位置,选择所有符合条件的条件
* * 匹配所有元素节点
[] [] 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)
&#124 [,] 支持迭代器中做多选
[] ?() 支持过滤操作
n/a () 支持表达式计算
() n/a 分组,JsonPath不支持

使用示例

$ 是查找的根节点,传参数是python的dict 类型,当查找到的时候返回一个list结果,查找失败的时候返回 False.

import jsonpath
# 作者-上海悠悠 QQ交流群:717225969

result = {
"code": 0,
"data": [
{
"age": 20,
"create_time": "2019-09-15",
"id": 1,
"mail": "283340479@qq.com",
"name": "yoyo",
"sex": "M"
},
{
"age": 21,
"create_time": "2019-09-16",
"id": 2,
"mail": "123445@qq.com",
"name": "yoyo111",
"sex": "M"
}
],
"msg": "success!"
}

msg = jsonpath.jsonpath(result, '$.msg')
print(msg) # 输出结果 ['success!']
names = jsonpath.jsonpath(result, '$..name')
print(names) # 输出结果 ['yoyo', 'yoyo111']
no = jsonpath.jsonpath(result, '$..yoyo')
print(no) # 找不到是结果是 False

这样就可以不用管层级结构也能取值了。

(0)

相关推荐

  • (三)断言封装整合到requests封装中应用(纠错False,Result循环,tag测试)

    检查json_key_value: 检查: requests.py # -*- coding: utf-8 -*-#@File :demo_04.py#@Auth : wwd#@Time : 2020 ...

  • 如何利用pyecharts绘制炫酷的关系网络图?

    如何利用pyecharts绘制炫酷的关系网络图 这是本学期在大数据哲学与社会科学实验室做的第六次分享了. 第一次分享的是: 如何利用"wordcloud+jieba"制作中文词云? ...

  • python接口自动化39-JMESPath解析json数据

    前言 前面学了 jsonpath 可以很好的解析 json 数据,提取出我们想要的内容,对于平常的基本工作没太大的问题,但有一点点小遗憾. jsonpath 的 python 库功能并不是很强大,不支 ...

  • python接口自动化13-data和json参数傻傻分不清

    前言 在发post请求的时候,有时候body部分要传data参数,有时候body部分又要传json参数,那么问题来了:到底什么时候该传json,什么时候该传data? 一.识别json参数 1.在前面 ...

  • python接口自动化34-json校验神器jsonschema

    前言 前面一篇讲到json解析神器jsonpath, jsonpath是为了方便快速取值,如果我们要校验json的字段类型和格式,就不是那边方便了. 比如当接口返回一个token,这个token值不是 ...

  • python接口自动化1-发送get请求

    前言 requests模块,也就是老污龟,为啥叫它老污龟呢,因为这个官网上的logo就是这只污龟,接下来后面的自动化都离不开它. 一.环境安装 1.用pip安装requests模块 >>p ...

  • python接口自动化2-发送post请求

    前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实 ...

  • python接口自动化3-自动发帖(session)

    前言 上一篇模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等,这时候如何保持会话呢? 一.session简介 1.查看帮助文档,贴了一部分,后面省略了 >>im ...

  • python接口自动化4-绕过验证码登录(cookie)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  • python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

  • python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...