一. JSON介绍
1. JSON(JavaScript Object Notation)是接口测试中常见的数据格式,它是一种基于轻量级文本的数据交换格式。
2. JSON数据的规则定义
1)JSON字符串必须用双引号编写
2)JSON中并列数据之间用逗号隔开
3)JSON中映射用冒号表示
3. JSON数据有6种数据类型(4简单2复杂)
string类型:字符串类型, e.g: {"name": "chinablue"} number类型:数字类型, e.g: {"age": 18, "price", 20.19, "coefficient": "-1.1"} boolean类型:布尔类型, e.g: {"is_open": true, "is_return", false} null类型:null类型, e.g: {"is_json": null} array类型:数组类型, e.g: {"data": [1, 2, 3]} object类型:对象类型, e.g: {"data": {"name": "chinablue", "age": 18}}
二. 将Python中的dict类型数据转为json字符串
思路:使用Python3内置的json库来进行json序列化操作
2.1 json.dumps()的基本使用
示例代码:
# -*- coding: utf-8 -*- # @Time : 2021/3/7 14:16 # @Author : chinablue # @File : tmp0307.py import json data_dict = { "name": "chinablue", "age": 18, "is_single": True, "hobby": ["basketball", "football"], "score": { "English": (99.8, 100), "math": None, "语文": (100, 150), } } # 转换前 print(f"【data_dict】数据类型:{type(data_dict)},数据内容:{data_dict}") # 转换后 data_json = json.dumps(data_dict) print(f"【data_json】数据类型:{type(data_json)}, 数据内容:{data_json}")
执行结果:
【data_dict】数据类型:<class ‘dict‘>,数据内容:{‘name‘: ‘chinablue‘, ‘age‘: 18, ‘is_single‘: True, ‘hobby‘: [‘basketball‘, ‘football‘], ‘score‘: {‘English‘: (99.8, 100), ‘math‘: None, ‘语文‘: (100, 150)}} 【data_json】数据类型:<class ‘str‘>, 数据内容:{"name": "chinablue", "age": 18, "is_single": true, "hobby": ["basketball", "football"], "score": {"English": [99.8, 100], "math": null, "\u8bed\u6587": [100, 150]}}
分析说明:
1) 序列化后,python数据类型和json数据类型的映射关系如下:
Python数据类型 | JSON数据类型 | Python数据类型 | JSON数据类型 |
str | string | True,False | true,false |
int,float | number | list,tuple | array |
None | null | dict | object |
2) 序列化后,json数据中字符串会默认使用双引号,这也是json数据的明确规则
3) 序列化后,中文会默认转换为对应的ASCII编码
2.2 让json.dumps()支持自定义对象的序列化操作
示例代码:
# -*- coding: utf-8 -*- # @Time : 2021/3/7 14:16 # @Author : chinablue # @File : tmp0307.py import json class Info(): """这是一个业务信息类""" data_dict = { "name": "chinablue", "age": 18, "info": Info(), } data_json = json.dumps(data_dict) print(data_json)
执行结果:
TypeError: Object of type ‘Info‘ is not JSON serializable
分析说明:
json.dumps()方法默认情况下不支持自定义类对象的序列化操作,所以会报错
解决思路:
通过实现一个json.JSONEncoder的子类,并重写其default()方法。让json模块来支持更多对象的序列化操作
代码改进:
# -*- coding: utf-8 -*- # @Time : 2021/3/7 14:16 # @Author : chinablue # @File : tmp0307.py import json class Info(): """这是一个业务信息类""" def __str__(self): return rf"这是一个业务信息类" class MyEncoder(json.JSONEncoder): """通过实现一个json.JSONEncoder的子类,并重写其default()方法。让json模块来支持更多对象的序列化操作""" def default(self, obj): # 如果是字节数据,直接将其转为字符串数据 if isinstance(obj, bytes): return obj.__str__() # 如果是自定义类Info的对象,将其转为字符串数据 elif isinstance(obj, Info): return obj.__str__() return json.JSONEncoder.default(self, obj) data_dict = { "name": "chinablue", "age": 18, "info": Info(), } data_json = json.dumps(data_dict, cls=MyEncoder, ensure_ascii=False) print(data_json)
执行结果:
{"name": "chinablue", "age": 18, "info": "这是一个业务信息类"}
三. 自动化测试报告中呈现JSON数据
3.1 需求分析
1. 期望报告中显示的json数据是格式化缩进形式的
data_json = json.dumps(data_dict, indent=4)
2. 期望报告中显示的json数据是按key进行排序的
data_json = json.dumps(data_dict, sort_keys=True)
3. 期望报告中显示的json数据是支持显示中文的
data_json = json.dumps(data_dict, ensure_ascii=False)
3.2 呈现效果展示