返回顶部
分享到

Python使用Marshmallow轻松实现序列化和反序列化

python 来源:未知 作者:佚名 发布时间:2025-03-05 20:55:09 人浏览
摘要

可能很多Python开发者都遇到过序列化。你可能会问:花姐,序列化有什么好聊的?这不就是把对象转成字符串、从字符串转回来吗?对啊,没错,序列化确实这么简单。但是,当你一开始使用

可能很多Python开发者都遇到过——序列化。你可能会问:花姐,序列化有什么好聊的?这不就是把对象转成字符串、从字符串转回来吗?对啊,没错,序列化确实这么简单。但是,当你一开始使用Python自带的json库时,可能会觉得很方便。但慢慢地,你会发现,它的功能有点单薄,特别是在一些复杂的数据处理场景中。今天就让我来给大家普及一下,为什么我放弃了json,而选择了功能更强大的Marshmallow!

为什么放弃json库

json库的局限性

大家都知道,json是Python内置的库,支持将Python对象转为JSON格式的字符串(序列化),以及将JSON字符串转回Python对象(反序列化)。这在日常开发中确实够用,尤其是对于简单的字典、列表和字符串。但当你的数据结构变得复杂时,json的局限性就暴露出来了。

举个例子,假设你有一个对象,需要序列化成JSON格式,但这个对象不仅仅是普通的字典,它可能嵌套了其他对象,或者你希望在序列化时有一些特定的字段验证、格式化,甚至是嵌套对象的转换——这个时候,json库就力不从心了。

Marshmallow,拯救我!

这时候,Marshmallow应运而生!它不仅可以轻松地进行序列化和反序列化,还支持对象验证、字段转换、数据清洗等强大功能。简直就是复杂数据操作的“超级英雄”!

Marshmallow入门:如何用Marshmallow序列化和反序列化数据

安装Marshmallow

首先,我们来安装Marshmallow。打开你的终端,执行以下命令:

1

pip install marshmallow

定义Schema

Marshmallow的核心概念是Schema。你可以通过定义Schema来指定如何将Python对象序列化为JSON,以及如何将JSON反序列化为Python对象。

举个例子,假设你有一个User类,需要将其转换成JSON格式:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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对象。下面是如何做的:

1

2

3

4

# 反序列化(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的:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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还支持对字段进行转换。例如,我们可以将一个字符串转换为日期格式,或者将数字转换为货币格式等。

1

2

3

4

5

6

7

8

9

10

11

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,你可以在一个对象中包含其他对象的数据。

例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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开发者的“必备神器”!


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Python实现高精度敏感词过滤

    Python实现高精度敏感词过滤
    一、需求分析:敏感词过滤的四大核心挑战 准确性要求:误判率需低于0.01% 性能压力:单机QPS需达到10万+ 对抗升级:需识别变体、拼音、谐
  • Python使用Marshmallow轻松实现序列化和反序列化
    可能很多Python开发者都遇到过序列化。你可能会问:花姐,序列化有什么好聊的?这不就是把对象转成字符串、从字符串转回来吗?对啊,
  • Python中从文件路径中提取文件名及扩展名的多种
    1. 使用字符串的 split() 方法提取文件名 问题描述: 给定一个文件路径,如何提取出文件名(包括扩展名)? Python提供了多种方式来处理文
  • Python如何快速下载依赖
    Python快速下载依赖 在 Python 里,若要快速下载依赖,可采用以下几种方法: 1. 使用国内镜像源 Python 依赖通常从 Python Package Index(PyPI)下载
  • 基于Python实现多语言朗读与单词选择测验
    在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音。这样的
  • 使用Python编写测试脚本
    1. 工具库简介 1.1 python-can 定位:通用的 CAN 总线通信库,支持多种硬件接口(SocketCAN、PCAN、Kvaser 等)。 核心功能: 连接物理 CAN 设备或虚
  • 使用Python构建Markdown转Word文档转换器

    使用Python构建Markdown转Word文档转换器
    在当今的文档处理中,Markdown因其简洁的语法和易读性而广受欢迎,而Microsoft Word(DOCX格式)则因其广泛的兼容性和专业的排版效果成为商业
  • 使用Python实现Excel中文转拼音

    使用Python实现Excel中文转拼音
    在日常办公中,我们经常需要处理Excel文件,有时候需要将中文转换为拼音缩写以方便检索和使用。今天我将分享一个使用Python开发的小工具
  • Python实现批量添加视频文本水印
    这个是一个基于PyQt5开发的视频水印批量添加工具,旨在为多个视频文件添加文本水印。用户可以自定义水印的文本内容、字体颜色、字号大
  • 在不同系统间迁移Python程序的方法
    在开发 Python 项目时,我们常常会遇到需要将在 Windows 系统上编写的程序迁移到 Linux 服务器上运行的情况,尤其是当服务器环境存在差异(
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计