可能很多python开发者都遇到过——序列化。你可能会问:花姐,序列化有什么好聊的?这不就是把对象转成字符串、从字符串转回来吗?对啊,没错,序列化确实这么简单。但是,当你一开始使用python自带的json
库时,可能会觉得很方便。但慢慢地,你会发现,它的功能有点单薄,特别是在一些复杂的数据处理场景中。今天就让我来给大家普及一下,为什么我放弃了json
,而选择了功能更强大的marshmallow!
为什么放弃json库
json库的局限性
大家都知道,json
是python内置的库,支持将python对象转为json格式的字符串(序列化),以及将json字符串转回python对象(反序列化)。这在日常开发中确实够用,尤其是对于简单的字典、列表和字符串。但当你的数据结构变得复杂时,json
的局限性就暴露出来了。
举个例子,假设你有一个对象,需要序列化成json格式,但这个对象不仅仅是普通的字典,它可能嵌套了其他对象,或者你希望在序列化时有一些特定的字段验证、格式化,甚至是嵌套对象的转换——这个时候,json
库就力不从心了。
marshmallow,拯救我!
这时候,marshmallow应运而生!它不仅可以轻松地进行序列化和反序列化,还支持对象验证、字段转换、数据清洗等强大功能。简直就是复杂数据操作的“超级英雄”!
marshmallow入门:如何用marshmallow序列化和反序列化数据
安装marshmallow
首先,我们来安装marshmallow。打开你的终端,执行以下命令:
pip install marshmallow
定义schema
marshmallow的核心概念是schema。你可以通过定义schema来指定如何将python对象序列化为json,以及如何将json反序列化为python对象。
举个例子,假设你有一个user
类,需要将其转换成json格式:
from marshmallow import schema, fields class user: def __init__(self, name, age, email): self.name = name self.age = age self.email = email class userschema(schema): name = fields.str() age = fields.int() email = fields.email() # 创建一个user对象 user = user(name="小李", age=30, email="xiaoli@example.com") # 创建userschema实例 user_schema = userschema() # 序列化对象(user -> json) user_json = user_schema.dump(user) print(user_json)
这里,我们定义了一个user
类和一个userschema
类,userschema
继承自marshmallow.schema
,并通过fields
模块定义了我们希望序列化的字段(name
、age
和email
)。
通过dump()
方法,我们将user
对象转换成了一个json兼容的字典格式。打印出来的结果大概是这样的:
{'name': '小李', 'age': 30, 'email': 'xiaoli@example.com'}
反序列化:从json到python对象
除了序列化,marshmallow还支持反序列化,也就是将json转换回python对象。下面是如何做的:
# 反序列化(json -> user对象) user_data = {'name': '小周', 'age': 28, 'email': 'xiaozhou@example.com'} user_obj = user_schema.load(user_data) print(user_obj)
输出将会是一个字典:
{'name': '小周', 'age': 28, 'email': 'xiaozhou@example.com'}
这时候,你的python对象就可以正常使用了!marshmallow会自动把输入的json转换成python对象,并进行验证。非常方便!
marshmallow进阶:验证与字段转换
字段验证
在日常开发中,我们通常希望确保传入的数据是合法的,比如用户名不能为空,年龄必须是正数。marshmallow支持多种验证功能,通过fields
模块的validators可以轻松实现。
例如,我们希望确保用户的年龄是大于0的:
from marshmallow import schema, fields, validate class userschema(schema): name = fields.str(required=true) age = fields.int(required=true, validate=validate.range(min=1)) email = fields.email(required=true) # 创建userschema实例 user_schema = userschema() # 测试数据 user_data = {'name': '小李', 'age': -5, 'email': 'xiaoli@example.com'} try: user = user_schema.load(user_data) except exception as e: print(e) #{'age': ['must be greater than or equal to 1.']}
如果年龄小于1,marshmallow会抛出验证错误,提示我们“年龄必须大于等于1”。这就是字段验证的强大之处!
字段转换
除了验证,marshmallow还支持对字段进行转换。例如,我们可以将一个字符串转换为日期格式,或者将数字转换为货币格式等。
from marshmallow import schema, fields class eventschema(schema): name = fields.str() date = fields.date() # 反序列化时,marshmallow会自动将字符串转为日期对象 event_data = {'name': 'python大会', 'date': '2025-01-21'} event_schema = eventschema() event_obj = event_schema.load(event_data) print(event_obj)
输出结果会是:
{'name': 'python大会', 'date': datetime.date(2025, 1, 21)}
是不是很方便?通过这种方式,你可以轻松地处理各种数据格式和转换!
marshmallow的高级特性:嵌套schema和自定义序列化
嵌套schema
有时候,我们的对象不仅仅是简单的字段,它们可能会嵌套其他对象。marshmallow也能轻松处理这一点!通过定义嵌套的schema
,你可以在一个对象中包含其他对象的数据。
例如:
from marshmallow import schema, fields # 定义address的schema class addressschema(schema): province = fields.str() #省 city = fields.str() #市 # 定义user的schema,包含嵌套的addressschema class userschema(schema): name = fields.str() age = fields.int() address = fields.nested(addressschema()) # 创建address对象数据 user_address = dict(province="河北省",city="邯郸市") # 创建user对象数据,其中包含artist对象 user = dict(name="花姐", age=18,address=user_address) # 创建userschema实例 schema = userschema() # 使用dump方法序列化数据 result = schema.dump(user) # 打印序列化结果 print(result)
输出结果会是:
{'name': '花姐', 'age': 18, 'address': {'province': '河北省', 'city': '邯郸市'}}
这个例子展示了如何在userschema
中嵌套另一个addressschema
,通过fields.nested()
实现对象的嵌套序列化。你可以轻松地序列化复杂的对象结构。
总结
marshmallow在python的序列化和反序列化处理中提供了极大的灵活性和强大的功能。从基本的对象转换到复杂的数据验证、嵌套序列化,它都能轻松搞定。比起json
库,marshmallow更适合处理复杂的对象结构、字段验证和格式转换,让你在处理数据时更加得心应手。
当然,marshmallow也不是完美无缺的,它的学习曲线可能相对json
稍微陡峭一些,但一旦掌握,你会发现它在工作中无比强大,几乎是一个python开发者的“必备神器”!
到此这篇关于python使用marshmallow轻松实现序列化和反序列化的文章就介绍到这了,更多相关python marshmallow序列化和反序列化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论