python3 接口测试 字典、json 、jsonpath 的应用场景

目录

简介

一、应用场景:

二、Python字典和JSON的区别

三、Python 字典和Json之间的转换

1. json.loads()

2. json.dumps()

3. json.load()

4. json.dump()

四、jsoJsonPath

1.操作符

2. 表达试

3. 过滤器

4. 函数

5. Python 之 jsonpath 应用


简介

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互;

一、应用场景:

1. python + requests 请求接口时,入参一般是python语言的默认字典格式,如果有的接口的参数要求json格式就需要进行数据转换;如果出参接口返回的json格式,需要转换成python语言的格式字典格式;

2. jsonpath 注意用于提取接口返回参数的值,使用jsonpath提取数据方便快捷;

二、Python字典和JSON的区别

1、Python字典是一种数据结构,JSON是一种数据传输格式

2、Python字典的类型是字典strDic={“a”:1},JSON的类型是字符串。例如,一个JSON是strJson = ‘{“a”:1}’,即strJosn这个变量是一个符合JSON格式的字符串。

3、Python字典的键key、值value可用单引号或者双引号,JSON强制必须使用双引号作为键key和值value的边界符号(json值value如果是数字可以不加双引号,但是键key只能是双引号引起来的字符串

4、Python字典的键key不可以重复,JSON的键key可以重复;

5、Python字典的键key可以是不可变类型对象,JSON的键key只能是字符串;

6、Python字典的键key默认没有默认值,JSON任意键key存在默认值undefined

7、Python字典的值value没有任何限制,可以是任意Python对象(包括首字母大写的布尔值True和False、空值None),JSON的值value只能是字符串、浮点数、小写的布尔值true和false(对应Python的True和False)、空值null(对应Python的None),或者它们JSON所构成的数组或者对象

8、Python字典里可以嵌套tuple,JSON里只有数组array。比如,,json.dumps({1:1}) 的结果是{“1”:1};json.dumps((1,2)) 的结果是[1,1];

9、JSON中文必须是Unicode编码(UTF-8代表8位一组表示Unicode字符的格式,即UTF-8是Unicode的实现方式之一)。比如,Python字典里{“me”: “我”}是合法的,JSON里必须是{“me”: “\u6211”}

三、Python 字典和Json之间的转换

1. json.loads()

把Json格式字符串解码转换成Python对象,从json到python的类型转化对照如下:

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone


import json

strList = '[1, 2, 3, 4]'
strDict = '{"city": "北京", "name": "大猫"}'

print(json.loads(strList))
print(json.loads(strDict))

'''
=====输出结果将json格式转换成python对象============

[1, 2, 3, 4]
{'city': '北京', 'name': '大猫'}
'''

2. json.dumps()

实现python类型转化为json字符串,返回一个str对象把一个Python对象编码转换成Json字符串,从python原始类型向json类型的转化对照如下:


import json

listStr = [1, 2, 3, 4]

tupleStr = (1, 2, 3, 4)

dictStr = {"city": "北京", "name": "大猫"}

print(json.dumps(listStr))
print(json.dumps(tupleStr))

# 注意:json.dumps() 序列化时默认使用的ascii编码
# 添加参数 ensure_ascii=False 禁用ascii编码,按utf-8编码
print(json.dumps(dictStr))
print(json.dumps(dictStr, ensure_ascii=False))

3. json.load()

读取文件中json形式的字符串元素 转化成python类型


import json
strList = json.load(open("listStr.json"))
print(strList)

4. json.dump()

字典转为json后存入文件


import json


dictStr = {"city": "北京", "name": "大刘"}

#把dicStr字典转换成json形式,然后存入文件dictStr.json
json.dump(dictStr, open("dictStr.json","w"), ensure_ascii=False)

四、jsoJsonPath

JsonPath用符号$表示最外层对象,类似于Xpath中的根元素

JsonPath可以通过点语法来检索数据,如:shell $.store.book[0].title,也可以使用中括号[]的形式,如shell $['store']['book'][0]['title']

jsonpath方法需要两个参数:
参数1:数据
参数2:jsonpath表达式

注意点:
1.如果没有匹配不到数据返回的是False
2.匹配到数据返回的是包含数据的列表

1.操作符

JsonPath符号描述
$查询的根节点对象,用于表示一个json数据,可以是数组或对象
@过滤器断言(filter predicate)处理的当前节点对象,类似于java中的this字段
*通配符,可以表示一个名字或数字
可以理解为递归搜索,Deep scan. Available anywhere a name is required.
.表示一个子节点
[‘’ (, ‘’)]表示一个或多个子节点
[ (, )]表示一个或多个数组下标
[start:end]数组片段,区间为[start,end),不包含end
[?()]

过滤器表达式,表达式结果必须是boolean

2. 表达

JsonPath用符号$表示最外层对象,类似于Xpath中的根元素
jsonPath可以用:

点表示法:.store.book [0].title

括号表示法:$['store']['book'][0]['title']

JsonPath表达式结果
$.store.book[*].author 或 $…author查询根节点下book节点的所有author信息
$.store.* 显示所有叶子节点值查询根节点下store节点的所有author信息
$.store…price查询根目录下store节点的所有东西price信息
$…book[0,1] 或 $…book[:2]查询根节点下book节点的前两个值
$…book[-2:]查询根节点下book节点的最后两个值
$…book[?(@.isbn)]所有具有isbn属性的书
$.store.book[?(@.price < 10)]查询根节点下book节点所有价格小于10的书
$…book[?(@.price <= $[‘expensive’])]查询根节点下book节点所有价格低于expensive字段的书
$…book[?(@.author =~ /.*REES/i)]所有符合正则表达式的书
$…*返回所有
$…book.length()查询根节点下book节点符合条件的数量

3. 过滤器

过滤器是用于过滤数组的逻辑表达式,一个通常的表达式形如:[?(@.age > 20)],可以通过逻辑表达式&&或||组合多个过滤器表达式,例如[?(@.price < 10 && @.book == ‘fiction’)],字符串必须用单引号或双引号包围,例如[?(@.color == ‘baclk’)] or [?(@.color == “white”)]。

操作描述
==等于
!=不等于
>大于
>=大于等于
<小于
<=小于等于
=~匹配[JavaScript正则表达式]例如,匹配描述以cat开头(不区分大小写)的项目。[?(@.description =~ /cat.*/i)]
!用于取消过滤条件:[?(!@.isbn)]匹配不具有该isbn属性的项目。
&&逻辑AND,用于合并多个过滤器表达式:[?(@.category=='fiction' && @.price < 10)]
||逻辑OR,用于组合多个过滤器表达式:[?(@.category=='fiction' || @.price < 10)]
in大于
=~大于

4. 函数

注意:可以在JsonPath表达式执行后进行调用,其输入值为表达式的结果。

名称描述输出
min()获取数值类型数组的最小值Double
max()获取数值类型数组的最大值Double
avg()获取数值类型数组的平均值Double
stddev()获取数值类型数组的标准差Double
length()获取数值类型数组的长度Integer

5. Python 之 jsonpath 应用

import jsonpath

d = {
    "error_code": 0,
    "stu_info":
 [
            {"id": 223,
             "name": "null",
             "sex": "女",
             "classname": "212期"
 },
            {"id": 224,
             "name": "景龙",
             "sex": "男",
             "classname": "212期"
 },
            {"id": 225,
             "name": "MS226",
             "sex": "男",
             "classname": "212期"
 }
        ]
}

# 模糊匹配
data1 = jsonpath.jsonpath(d, "$..name")
print(data1)
# 精准匹配
data2 = jsonpath.jsonpath(d, "$.stu_info[0].name")
print(data2)
# 精准匹配(同上)
data3 = jsonpath.jsonpath(d, "$.stu_info[0]..name")
print(data3)
# 匹配所有数据
data4 = jsonpath.jsonpath(d, "$.*")
# print(data4)
# 匹配前两个学员信息
data5 = jsonpath.jsonpath(d, "$.stu_info[:2]")
print(data5)
# 匹配女生的信息
data6 = jsonpath.jsonpath(d, "$.stu_info[?(@.sex== '女')]")
print(data6)
# 过滤后,显示有性别数据的信息
data7 = jsonpath.jsonpath(d, "$.stu_info[?(@.sex)]")
print(data7)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学僧星海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值