marshmallow:Python 对象序列化这件事,它替你包圆了

marshmallow 在 GitHub 上已有 7,240 Star。

它是一个与 ORM、ODM 和框架无关的 Python 库,核心任务只有一个:把复杂的 Python 对象转成字典、JSON 这类原生数据类型,或者反向把原始数据还原成对象。序列化、反序列化、输入验证,这些活儿它一包到底。

1、这玩意儿是干嘛的

一句话说:给 Python 对象和数据格式之间搭一座桥。

你有一个嵌套了日期、字符串、自定义类的对象,想转成 JSON 发给前端,或者从 API 收到的 JSON 想变成 Python 对象再做业务处理,marshmallow 用 Schema 定义好字段规则,一行代码完成转换。

正文顶部截图

Schema 支持字段校验、类型转换、嵌套结构。字段类型覆盖字符串、整数、浮点、日期、列表、嵌套对象等常用类型。你定义一次规则,序列化和反序列化都能复用。验证失败时会抛出 ValidationError,错误信息包含具体字段和失败原因,方便定位问题。

2、为什么要用它

Python 生态里处理数据转换的选择不少,但大部分要么绑定了特定框架,要么只做一半。Django REST framework 的序列化器离不开 Django,Pydantic 侧重校验和类型提示,而 marshmallow 的定位是纯粹的对象序列化工具,不依赖任何上层框架。

README区域截图

它把三件事做到了一起:校验输入数据、反序列化为应用对象、序列化为原始 Python 类型。输出结果可以直接送给 json.dumps() 变成 JSON 字符串。不需要你在多个工具之间来回切换。

另一个实用点是它的生态系统。围绕 marshmallow 已经衍生出不少扩展库,支持 SQLAlchemy 集成、JSON Schema 生成、Web 框架集成等场景,官方 wiki 里有完整的列表可供查阅。

3、核心用法

安装:

pip install -U marshmallow

定义 Schema:

from datetime import date
from marshmallow import Schema, fields

class ArtistSchema(Schema):
    name = fields.Str()

class AlbumSchema(Schema):
    title = fields.Str()
    release_date = fields.Date()
    artist = fields.Nested(ArtistSchema())

bowie = dict(name="David Bowie")
album = dict(artist=bowie, title="Hunky Dory", release_date=date(1971, 12, 17))

schema = AlbumSchema()
result = schema.dump(album)
print(result)
# {'artist': {'name': 'David Bowie'}, 'release_date': '1971-12-17', 'title': 'Hunky Dory'}

Nested 字段让嵌套对象的处理变得直接。ArtistSchema 被嵌进 AlbumSchema,序列化时层级结构保持完整。dump() 负责序列化,load() 负责反序列化,两个方向共用同一套 Schema 定义。

4、适合哪些人用

  • 需要把 Python 对象序列化为 JSON 或其他格式输出的后端开发者
  • 从 API 接收原始数据后需要校验并转换为内部对象的工程师
  • 希望序列化逻辑与框架解耦、能在不同项目间复用代码的人

  • 从 API 接收原始数据后需要校验并转换为内部对象的工程师
  • 希望序列化逻辑与框架解耦、能在不同项目间复用代码的人

更多推荐