导语:今天学习一下json
JSON简介
JSON是一种广泛使用的数据格式,其语法基于JavaScript对象字面量表示法,但JSON本身是语言无关的。它主要用于数据交换,特别是在服务器与客户端之间。
JSON与Python字典的关系
在Python中,JSON格式与字典非常相似,但有以下区别:
- JSON的键和字符串值必须使用双引号(
"
),而Python字典的键和字符串值可以使用单引号('
)或双引号。 - JSON直接支持的数据类型包括字符串、数字、对象(在Python中对应字典)、数组(在Python中对应列表)、布尔值和
null
。Python字典则可以包含更复杂的数据类型,如元组、集合等。
字典转JSON
首先,我们创建一个Python字典:
import json
dict = {"name": "cuicui", "age": 25, "score": 90}
print("打印出的是{},格式是{}".format(dict, type(dict)))
打印出的是{'name': 'cuicui', 'age': 25, 'score': 90},格式是<class 'dict'>
接下来,我们将这个字典转换为JSON格式的字符串:
dict_json = json.dumps(dict)
print("打印出的是{},格式是{}".format(dict_json, type(dict_json)))
打印出的是{"name": "cuicui", "age": 25, "score": 90},格式是<class 'str'>
JSON转字典
现在,我们有一个JSON格式的字符串,我们将它转换回Python字典:
json_str = '{"name": "cuicui", "age": 25, "score": 90}'
json_dict = json.loads(json_str)
print("打印出的是{},格式是{}".format(json_dict, type(json_dict)))
打印出的是{'name': 'cuicui', 'age': 25, 'score': 90},格式是<class 'dict'>
修改字典并转换回JSON
假设我们需要在字典中添加一个新键值对,然后再将其转换回JSON格式:
dict['gender'] = 'male'
json_str_new = json.dumps(dict)
print("修改后的JSON字符串:{}".format(json_str_new))
修改后的JSON字符串:{"name": "cuicui", "age": 25, "score": 90, "gender": "male"}
使用场景
场景 1:验证API响应内容
场景描述:测试一个用户注册API,验证返回的JSON响应是否符合预期。
操作步骤:
- 使用测试工具(如Postman、JMeter或Python的requests库)发送一个注册请求到API。
- 捕获API返回的JSON响应。
- 将捕获的JSON响应与预期的JSON模式(字典)进行比较。
代码示例(使用Python的requests库):
import requests
import json
# 预期的响应模式
expected_response = {
"status": "success",
"message": "用户注册成功!",
"data": {
"user_id": "123456",
"username": "testuser",
"email": "testuser@example.com"
}
}
# 发送注册请求
response = requests.post('http://api.com/register', json={
"username": "testuser",
"password": "testpassword",
"email": "testuser@example.com"
})
# 将响应内容转换为字典
response_dict = response.json()
# 验证响应是否符合预期
assert response_dict == expected_response
场景 2:参数化测试
场景描述:对一个登录API进行参数化测试,验证不同用户名和密码组合的响应。
操作步骤:
- 准备一个包含不同用户名和密码组合的测试数据集(列表)。
- 对每个测试用例发送登录请求。
- 验证每个响应是否符合预期的成功或失败状态。
代码示例:
import requests
# 测试数据集
test_data = [
{"username": "user1", "password": "pass1"},
{"username": "user2", "password": "pass2"},
{"username": "user3", "password": "wrongpassword"}, # 预期失败
]
# 登录API的URL
login_url = 'http://api.com/login'
# 执行参数化测试
for data in test_data:
response = requests.post(login_url, json=data)
if data["password"] == "wrongpassword":
assert response.status_code == 401 # 预期失败状态码
else:
assert response.status_code == 200 # 预期成功状态码
场景 3:测试用户注册API
在测试一个用户注册API时,我们通常会发送包含用户信息的JSON请求,并验证API的响应。在这个场景中,我们想要测试API在接收到包含随机手机号的JSON请求时的处理能力。
操作步骤:
1、创建了一个包含用户名和手机号的JSON字符串。
2、修改了这个字符串,将单引号替换为双引号,使其成为一个有效的JSON格式。
3、使用json.loads()
将字符串转换为字典。
4、在这个字典中,我们调用generate_random_phone()
函数来生成一个随机的手机号,并将其更新到字典中。
5、我们使用json.dumps()
将修改后的字典转换回JSON字符串,并打印出来。
通过这种方式,我们可以测试API在接收到包含随机手机号的JSON请求时的处理能力,确保API能够正确处理这种格式的数据。
代码示例:
import json
import random
# 原始JSON字符串,包含用户的手机号
s = '''{'username':'cuicui', 'phone':'1880000000'}'''
# 将单引号替换为双引号以形成有效的JSON字符串
s = s.replace("'", '"')
# 将字符串转换为字典
data = json.loads(s)
# 生成随机手机号
def generate_random_phone():
return "1" + "".join([str(random.randint(0, 9)) for _ in range(10)])
# 更新字典中的手机号
data['phone'] = generate_random_phone()
# 将字典转换回JSON字符串
updated_s = json.dumps(data)
# 打印修改后的JSON字符串
print(updated_s)
总结
下次见,拜拜~