可能很多Python开发者都遇到过序列化。你可能会问:花姐,序列化有什么好聊的?这不就是把对象转成字符串、从字符串转回来吗?对啊,没错,序列化确实这么简单。但是,当你一开始使用
可能很多Python开发者都遇到过——序列化。你可能会问:花姐,序列化有什么好聊的?这不就是把对象转成字符串、从字符串转回来吗?对啊,没错,序列化确实这么简单。但是,当你一开始使用Python自带的json库时,可能会觉得很方便。但慢慢地,你会发现,它的功能有点单薄,特别是在一些复杂的数据处理场景中。今天就让我来给大家普及一下,为什么我放弃了json,而选择了功能更强大的Marshmallow! 为什么放弃json库json库的局限性 大家都知道,json是Python内置的库,支持将Python对象转为JSON格式的字符串(序列化),以及将JSON字符串转回Python对象(反序列化)。这在日常开发中确实够用,尤其是对于简单的字典、列表和字符串。但当你的数据结构变得复杂时,json的局限性就暴露出来了。 举个例子,假设你有一个对象,需要序列化成JSON格式,但这个对象不仅仅是普通的字典,它可能嵌套了其他对象,或者你希望在序列化时有一些特定的字段验证、格式化,甚至是嵌套对象的转换——这个时候,json库就力不从心了。 Marshmallow,拯救我! 这时候,Marshmallow应运而生!它不仅可以轻松地进行序列化和反序列化,还支持对象验证、字段转换、数据清洗等强大功能。简直就是复杂数据操作的“超级英雄”! Marshmallow入门:如何用Marshmallow序列化和反序列化数据安装Marshmallow首先,我们来安装Marshmallow。打开你的终端,执行以下命令:
定义SchemaMarshmallow的核心概念是Schema。你可以通过定义Schema来指定如何将Python对象序列化为JSON,以及如何将JSON反序列化为Python对象。 举个例子,假设你有一个User类,需要将其转换成JSON格式:
这里,我们定义了一个User类和一个UserSchema类,UserSchema继承自marshmallow.Schema,并通过fields模块定义了我们希望序列化的字段(name、age和email)。 通过dump()方法,我们将User对象转换成了一个JSON兼容的字典格式。打印出来的结果大概是这样的:
反序列化:从JSON到Python对象除了序列化,Marshmallow还支持反序列化,也就是将JSON转换回Python对象。下面是如何做的:
输出将会是一个字典:
这时候,你的Python对象就可以正常使用了!Marshmallow会自动把输入的JSON转换成Python对象,并进行验证。非常方便! Marshmallow进阶:验证与字段转换字段验证在日常开发中,我们通常希望确保传入的数据是合法的,比如用户名不能为空,年龄必须是正数。Marshmallow支持多种验证功能,通过fields模块的validators可以轻松实现。 例如,我们希望确保用户的年龄是大于0的:
如果年龄小于1,Marshmallow会抛出验证错误,提示我们“年龄必须大于等于1”。这就是字段验证的强大之处! 字段转换除了验证,Marshmallow还支持对字段进行转换。例如,我们可以将一个字符串转换为日期格式,或者将数字转换为货币格式等。
输出结果会是:
是不是很方便?通过这种方式,你可以轻松地处理各种数据格式和转换! Marshmallow的高级特性:嵌套Schema和自定义序列化嵌套Schema 有时候,我们的对象不仅仅是简单的字段,它们可能会嵌套其他对象。Marshmallow也能轻松处理这一点!通过定义嵌套的Schema,你可以在一个对象中包含其他对象的数据。 例如:
输出结果会是:
这个例子展示了如何在UserSchema中嵌套另一个AddressSchema,通过fields.Nested()实现对象的嵌套序列化。你可以轻松地序列化复杂的对象结构。 总结Marshmallow在Python的序列化和反序列化处理中提供了极大的灵活性和强大的功能。从基本的对象转换到复杂的数据验证、嵌套序列化,它都能轻松搞定。比起json库,Marshmallow更适合处理复杂的对象结构、字段验证和格式转换,让你在处理数据时更加得心应手。 当然,Marshmallow也不是完美无缺的,它的学习曲线可能相对json稍微陡峭一些,但一旦掌握,你会发现它在工作中无比强大,几乎是一个Python开发者的“必备神器”! |
2019-06-18
2019-07-04
2021-05-23
2021-05-27
2021-05-27