Python 操作 json 数据

news2024/9/24 5:27:17

在Python中,操作JSON数据主要包括序列化(将Python对象转换为JSON格式)和反序列化(将JSON字符串转换回Python对象)。

以下是使用Python内置的json模块进行这些操作的基本示例:

JSON 序列化 (Serialization)

将Python对象转换成JSON字符串:

import json
# 定义一个Python字典或列表等可序列化的对象
data = {    "name": "Alice",    "age": 30,    "hobbies": ["reading", "programming"]}
# 使用 json.dumps() 方法将 Python 对象转为 JSON 字符串
json_string = json.dumps(data)
print(json_string)  # 输出:{"name": "Alice", "age": 30, "hobbies": ["reading", "programming"]}

JSON 反序列化 (Deserialization)

将JSON字符串转换成Python对象:

import json# 假设我们有一个 JSON 格式的字符串
json_data = '{"name": "Bob", "age": 35, "hobbies": ["guitar", "travel"] }'
# 使用 json.loads() 方法将 JSON 字符串转为 Python 字典
python_obj = json.loads(json_data)print(python_obj)  
# 输出:{'name': 'Bob', 'age': 35, 'hobbies': ['guitar', 'travel']}
# 或者从文件读取 JSON 数据并转换
with open('data.json', 'r') as file:    
    python_obj_from_file = json.load(file)
print(python_obj_from_file)

注意事项:

JSON仅支持特定的数据类型,如数字、字符串、布尔值、null、数组(对应Python中的列表)和对象(对应Python中的字典)。Python中的一些非标准类型(如None、datetime对象、自定义类实例等)需要通过特殊方式处理才能正确地序列化和反序列化。

json.dumps() 方法接受额外的参数用于控制序列化过程,例如ensure_ascii=False可以输出包含非ASCII字符的JSON字符串,indent用于美化输出,设置缩进。

json.load()和json.loads()在遇到不符合JSON格式的输入时会抛出json.JSONDecodeError异常。

在Python进行接口自动化测试时,操作JSON数据是常见且关键的步骤。通常情况下,我们会使用json模块处理HTTP请求中的JSON内容,并通过requests库发送这些请求到API服务器。以下是一个基本示例,展示如何构建和解析JSON数据以执行接口测试:

发送带有JSON数据的POST请求

import requestsimport json
# 定义要发送的JSON数据
payload = {    "username": "testuser",    "password": "testpassword",    "email": "test@example.com"}
# 将Python字典转换为JSON格式字符串
json_payload = json.dumps(payload)
# 设置请求头信息,告诉服务器我们正在发送JSON数据
headers = {'Content-Type': 'application/json'}
# 发送POST请求
response = requests.post('http://example.com/api/login', data=json_payload, headers=headers)
# 检查响应状态码是否正常
if response.status_code == 200:    
    # 如果响应成功,将其内容反序列化为Python对象    
    response_json = response.json()    
    print(response_json)
else:    
    print(f"请求失败,状态码:{response.status_code}")
# 根据需要对响应JSON数据进行断言或进一步处理
assert response_json['status'] == 'success'

解析返回的JSON响应

对于从API接收到的JSON响应,可以使用response.json()方法将响应体的内容转化为Python字典或列表以便于进行验证。

数据驱动测试

在数据驱动测试场景中,可以从文件读取多个JSON记录(例如,每行一个JSON对象),然后依次对每个记录执行相同的操作:

with open('test_data.json') as f:    
    test_cases = json.load(f)
for case in test_cases:    
    # 调整请求参数并发送请求    
    response = requests.post('http://example.com/api/endpoint', json=case)    
    # 针对每个测试用例进行相应的断言    
    assert_response(response, case)

这里,test_data.json文件可能包含多条记录,每一项都是一个待测试的JSON数据结构。在循环中,逐个发送请求并根据每个用例的结果进行验证。

json在接口自动化里的高级使用

在接口自动化测试中,JSON的高级使用通常涉及到更复杂的数据操作、模式验证以及高效地提取和比较响应数据。以下是一些高级用例:

JsonPath 或 JMESPath 的应用:

使用jsonpath或jmespath库来从复杂的JSON响应中精准提取数据,而无需遍历整个数据结构。

import jsonpath  
# or jmespath for JMESPath
response_json = {"users": [{"name": "Alice", "id": 1}, {"name": "Bob", "id": 2}]}
names = jsonpath.jsonpath(response_json, '$.users[*].name')  # 返回 ['Alice', 'Bob']

JSON Schema验证:

使用jsonschema库对API返回的JSON响应进行模式匹配验证,确保其符合预定义的结构和约束条件。

from jsonschema import validate, ValidationError
schema = {    "type": "object",    "properties": {        "status": {"type": "string"},        "data": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "name": {"type": "string"}}}}    },    "required": ["status", "data"]}
response = {"status": "ok", "data": [{"id": 1, "name": "Alice"}]}
try:    
    validate(instance=response, schema=schema)    
    print("Response matches the schema.")
except ValidationError as e:    
    print(f"Validation error: {e}")

动态构建请求体:

根据需求动态生成或修改JSON请求体,例如基于数据库查询结果构造请求参数。

def build_request_body(user_id):    
    user_data = get_user_from_database(user_id)  
    # 假设这是一个获取用户信息的方法    
    request_body = {"user": {"id": user_data["id"], "name": user_data["name"]}}     return request_body
payload = build_request_body(1)
response = requests.post('http://example.com/api/update', json=payload)

批量执行与结果分析:

对于大批量的数据交互,可以将多个JSON请求组织成一个列表,并利用循环或异步方式发送请求,然后汇总所有响应的结果进行整体评估。

错误处理和容错机制:

对接收到的JSON数据进行深度检查,对于非标准格式或异常字段,能够有策略地处理并记录异常。

缓存和复用:

对于一些重复性的数据,如Token或者Header中的JWT,可以将其存储起来并在后续请求中复用,提高效率同时保持安全性。

通过以上这些高级技术,可以在接口自动化测试中更好地管理和操纵JSON数据,提高测试代码的质量和可维护性。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1596170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次事件到供应链的顶级拉扯

前言 某天,夜里3点 天刚蒙蒙亮 开局:我有一个朋友~ 看不懂发的什么意思,再仔细看看,懂了! 闲言少叙,遇事不决先上bp,启动! 进去之后发现基本没什么实际功能点,像假的一样。注意这里…

怎么修改图片大小?在线图片处理的方法介绍

在日常生活中,我们经常需要调整图片大小以适应不同的网络上传要求。不管是微信、QQ换头像背景图片,还是各种社交媒体相册,都需要对图片改大小,今天就介绍几个关于修改图片大小的方法,可以不用下载安装就能在线图片处理…

学浪怎么下载视频

购买了学浪的人希望能随时随地学习,而学浪提供了许多有价值的视频课程。然而,由于网络限制或个人需求,有时候我们可能希望将这些视频下载到本地。本文将介绍如何利用简单的工具实现学浪视频的下载,让学习变得更加自由灵活。 学浪…

OSPF 开放式最短路径优先协议

目录 技术产生原因:因为RIP存在不足 OSPF优点: RIPV2和OSPFV2比较: 相同点: 不同点: OSPF的结构化部署 --- 区域划分 区域划分的主要目的: 区域边界路由器 --- ABR : 区域划分的要求&am…

【源码】2024全开源多语言多商户跨境商城源码|多语言跨境外贸电商系统App

ikTok SHOP跨境电商系统V8版是一套B2CB2B跨境电商商城系统源码,多商户多语言,全新百变DIY模板;该系统支持B-C自营、B-B-C第三方卖家系统、B2B批发电商模式;该源码是使用Laravel框架PHP开发的,前后端全开源可二开。 版…

护眼灯什么牌子好,几款专业的护眼灯品牌推荐

​随着近视在孩子中的普遍性日益增加,家长们开始认识到,除了学业成就外,孩子的视觉健康同样需要早期关注。毕竟,学业的挫折可以逐步克服,但一旦视力受损,眼镜就可能成为终生的伴侣。鉴于此,专业…

企业级网络安全:入侵防御实时阻止,守护您的业务安全

随着互联网技术的快速发展,企业级网络安全问题日益凸显。在这个数字化时代,企业的业务安全不仅关系到企业的形象和声誉,还直接影响到企业的生存和发展。因此,加强企业级网络安全,预防和抵御各种网络攻击已成为企业的重…

【ThinkBox_Deadline_3dmax使用教程】

ThinkBox Deadline 3dmax使用教程 2019-01-18 10:51 1.打开Thinkbox.Deadline 监控器,设置超级用户才能操作提交渲染和设置任务。 2.设置插件和软件的路径的操作: 3.默认安装C盘安装在其他盘符的需要按照路径找相应格式的文件加载(标注的…

EPSON 的 RX8010SJ 为安防产品解决方案

EPSON作为实时时钟解决方案提供商中的佼佼者,为了适应市场需求,推出实时时钟模块RX8010SJ。该款实时时钟模块除了拥有超高性价比以外,还拥有不俗的整体性能,同时集成了日历功能可用于事件标记,非常适合应用在竞争日渐激…

【2024年认证杯】A题详细思路+数据(来源)+成品论文+模型代码(matlab+python)

2024年认证杯A题 解题思路 ⭐⭐第一问题分析第二问题分析第三问题分析 数据与数据来源🎉🎉指标解释数据来源 成品参考论文😊😊python/ matlab 代码🚀🚀 解题思路 ⭐⭐ 这个题目要求我们围绕人造保暖纤维的…

vue模版字符串解析成vue模版对象

模版字符串 this.code <template><div style"width:100% ; height: 100% ;">{{resultData[0].name}}</div> </template> <script> export default {data() {return {resultData: [{ name: 图幅, value: 20 },]}},mounted(){},method…

STM32移植嵌入式开源按键框架

目录 STM32移植嵌入式开源按键框架 MultiButton简介 multi_button.c文件 multi_button.h文件 按键事件 案例使用方法 学习剖析 STM32移植嵌入式开源按键框架 今天移植了一款嵌入式按键框架工程MultiButton&#xff0c;MultiButton是一个小巧简单易用的事件驱动型按键驱动…

15 Python进阶: random和pyecharts

Python random 模块主要用于生成随机数。 random 模块实现了各种分布的伪随机数生成器。 要使用 random 函数必须先导入&#xff1a; import randompython random 模块的一般用法 Python中的random模块提供了生成伪随机数的功能&#xff0c;可以用于模拟、游戏开发、密码学…

关于《CS创世 SD NAND》的技术学习分享

最近发现一个好玩的东西《CS创世 SD NAND》&#xff0c;带大家一起体验一下。 本文引用了部分厂家产品资料及图像&#xff0c;如有侵权&#xff0c;请及时联系我删除&#xff0c;谢谢。 《CS创世 SD NAND》官方网站&#xff1a;http://www.longsto.com/ 什么是CS创世 SD NAND呢…

电商API数据采集接口|跨境卖家在追求精细化运营过程中数字化选品商品采集和商品上架的多方面应用

现在跨境卖家都在追求精细化运营&#xff0c;在精细化运营过程中&#xff0c;数据分析少不了&#xff0c;下面为数据分析在选品、引流、转化率三个方面的应用。 电商商品详情数据采集API接口|数据化选品 全世界各个国家都有着自己的传统与文化&#xff0c;也有着自己的生活方式…

如何正确使用数字化仪前端信号调理?(二)

在上期文章如何正确使用数字化仪前端信号调理&#xff1f;&#xff08;一&#xff09;中&#xff0c;我们为大家介绍了数字化仪前端电路所需的特性以及使用过程中需要的输入抗阻和输入耦合&#xff0c;本期文章将为您介绍数字化仪前端信号调理的使用过程中所需的输入电压范围&a…

RabbitMQ实战教程(2)

十、RabbitMQ实战教程 在掌握了SpringCloudAlibaba的应用后&#xff0c;再来玩&#xff01;&#xff01; 为了更好的理解RabbitMQ在项目中的作用&#xff0c;来一套实战操作。 10.1 RabbitMQ实战场景 首先模拟一个场景&#xff0c;电商中对应的处理方案。 模拟一个用户在电…

WIFI详解及周边拓展

一、WiFi协议简介 WiFi协议&#xff0c;也称为无线保真技术&#xff0c;是一种允许电子设备通过无线方式在局域网&#xff08;WLAN&#xff09;和互联网上进行通信的技术标准。WiFi协议是基于IEEE 802标准的子系列标准协议&#xff0c;由电气和电子工程师协会制定。随着移动设备…

HTML的路径

路径的分类&#xff1a; 1.绝对路径 ~用于引用别处的图片&#xff08;非本地的&#xff09; 2.相对路径 ~用于引入自己项目内的图片 绝对路径&#xff1a; 绝对路径&#xff0c;即使从网上搜到的图片的位置&#xff08;我们以图床的方式为例&#xff09; 相对路径&#xff1a; …

TypeScript-官方基础模板创建的小程序,如何创建js文件

如何创建JS文件&#xff0c;不需要寻找“js”文件类型&#xff0c;只需要创建一个新的“文件”即可。 第一步:先删除 ts文件;如 index.ts 第二步:右键点击项目&#xff0c;选择“新建”&#xff0c;然后选择“文件”。 第三步:在弹出的界面中&#xff0c;在“文件名”中输入“…