Python marshmallow怎么用?marshmallow序列化字段详解

Marshmallow 是一个流行的 Python 库,主要用于对象的序列化和反序列化,它常用于将 Python 对象(如数据类、字典、ORM 模型等)转换为 JSON 格式(序列化),以及将 JSON 数据转换回 Python 对象(反序列化)。

Marshmallow 特别适用于 Web 开发框架(如 Flask、Django、FastAPI),因为它可以轻松地处理请求数据的验证和响应数据的格式化。

《Marshmallow Rag》棉花糖雷格泰姆 钢琴
加载中
《Marshmallow Rag》棉花糖雷格泰姆 钢琴

核心概念

  1. Schema(模式):定义数据结构、字段类型、验证规则等。
  2. 序列化(Serialization):将 Python 对象 → JSON/字典。
  3. 反序列化(Deserialization):将 JSON/字典 → Python 对象。
  4. 验证(Validation):在反序列化过程中检查数据是否符合预期。

安装

pip install marshmallow

基本示例

定义 Schema

from marshmallow import Schema, fields, validate
class UserSchema(Schema):
    id = fields.Int(dump_only=True)  # 只用于输出
    name = fields.Str(required=True, validate=validate.Length(min=1, max=50))
    email = fields.Email(required=True)
    age = fields.Int(validate=validate.Range(min=0, max=120))
    is_active = fields.Bool(default=True)

序列化(Python 对象 → JSON)

user = {
    "id": 1,
    "name": "Alice",
    "email": "alice@example.com",
    "age": 30,
    "is_active": True
}
schema = UserSchema()
result = schema.dump(user)
print(result)
# 输出: {'id': 1, 'name': 'Alice', 'email': 'alice@example.com', 'age': 30, 'is_active': True}

Python marshmallow怎么用?marshmallow序列化字段详解

反序列化(JSON → Python 对象)

json_data = {
    "name": "Bob",
    "email": "bob@example.com",
    "age": 25
}
try:
    result = schema.load(json_data)
    print(result)
    # 输出: {'name': 'Bob', 'email': 'bob@example.com', 'age': 25, 'is_active': True}
except Exception as e:
    print(e)

验证失败示例

invalid_data = {
    "name": "",  # 长度不足
    "email": "not-an-email",  # 无效邮箱
    "age": 200  # 超出范围
}
try:
    result = schema.load(invalid_data)
except Exception as e:
    print(e.messages)
    # 输出: {'name': ['Shorter than minimum length 1.'], 'email': ['Not a valid email address.', 'Field may not be null.'], 'age': ['Must be greater than or equal to 0 and less than or equal to 120.']}

常用字段类型

字段类型 说明
fields.Str() 字符串
fields.Int() 整数
fields.Float() 浮点数
fields.Bool() 布尔值

Python marshmallow怎么用?marshmallow序列化字段详解

fields.Email()

邮箱地址
fields.URL()URL 地址
fields.DateTime()日期时间
fields.Date()日期
fields.List()列表
fields.Dict()字典
fields.Nested()嵌套 Schema
fields.Method()自定义方法序列化
fields.Function()自定义函数序列化

嵌套 Schema

class AddressSchema(Schema):    street = fields.Str(required=True)    city = fields.Str(required=True)class UserSchema(Schema):    name = fields.Str(required=True)    address = fields.Nested(AddressSchema())# 使用user_data = {    "name": "Charlie",    "address": {        "street": "123 Main St",        "city": "New York"    }}schema = UserSchema()result = schema.load(user_data)print(result)# 输出: {'name': 'Charlie', 'address': {'street': '123 Main St', 'city': 'New York'}}

与 ORM 集成(以 SQLAlchemy 为例)

from marshmallow_sqlalchemy import SQLAlchemyAutoSchemaclass UserSQLAlchemySchema(SQLAlchemyAutoSchema):    class Meta:        model = User  # 你的 SQLAlchemy 模型        load_instance = True  # 反序列化时返回 ORM 实例

Python marshmallow怎么用?marshmallow序列化字段详解


常用验证器

from marshmallow import validate
# 字符串长度
name = fields.Str(validate=validate.Length(min=1, max=50))
# 数值范围
age = fields.Int(validate=validate.Range(min=0, max=120))
# 自定义正则表达式
phone = fields.Str(validate=validate.Regexp(r'^d{11}$'))
# 自定义验证函数
def validate_email(value):
    if not value.endswith('@example.com'):
        raise Exception("Email must be from example.com")
email = fields.Email(validate=validate_email)

最佳实践

  1. 使用 dump_only 和 load_only:避免敏感字段(如密码)被序列化或反序列化。
  2. 使用 required=True:确保必填字段存在。
  3. 使用验证器:在 Schema 层进行数据验证,而不是在业务逻辑中。
  4. 使用 Nested 字段:处理复杂数据结构。
  5. 使用 post_load 装饰器:在反序列化后执行自定义逻辑。
class UserSchema(Schema):
    name = fields.Str(required=True)
    email = fields.Email(required=True)
    @post_load
    def make_user(self, data, kwargs):
        return User(data)  # 返回自定义对象

Marshmallow 是一个强大且灵活的库,适合处理数据验证和序列化/反序列化任务,它在 Web 开发中非常有用,尤其是与 Flask、Django 或 FastAPI 等框架结合使用时。

如果你有任何具体问题或需要更详细的示例,请告诉我!

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/python-marshmallow%e6%80%8e%e4%b9%88%e7%94%a8%ef%bc%9fmarshmallow%e5%ba%8f%e5%88%97%e5%8c%96%e5%ad%97%e6%ae%b5%e8%af%a6%e8%a7%a3/

赞 (0)
Flipclock是什么?2026年最新倒计时器APP推荐
上一篇 2026年7月10日 02:04
硅谷圣何塞SPINSERVERS促销值得买吗?SPINSERVERS最新优惠活动详情
下一篇 2026年7月10日 02:07

相关推荐

  • Python入门难吗?零基础怎么学Python编程

    Python 2026年的核心价值已从“入门首选”转变为“全栈智能开发的基础设施”,掌握其生态意味着拥有连接AI模型、自动化办公与云端部署的通用能力,在2026年的技术语境下,谈论Python不再仅仅是讨论一门编程语言,而是在探讨如何高效利用现有的智能基础设施,随着大语言模型(LLM)的普及,Python作为A……

    2026年7月6日
    15010
  • 个人健康数据如何可视化分析?健康数据可视化分析平台推荐

    个人健康数据可视化分析的核心在于将零散的生理指标转化为直观图表,通过趋势监控与异常预警,帮助用户建立科学的健康管理闭环,而非仅仅展示冷冰冰的数字,我们每天佩戴的智能手表、手环,甚至家里的智能体脂秤,都在默默记录着你的心跳、睡眠和步数,但这些数据如果只停留在APP的列表里,就像把一堆散乱的零件堆在桌上,看不出它到……

    2026年6月14日
    2600
  • Tomcat多域名怎么配置?虚拟主机绑定域名怎么设置?

    Tomcat多域名管理通过修改conf/server.xml文件中的Host元素实现虚拟主机绑定,每个域名对应一个Host节点,配置完成后重启Tomcat即可生效,这是整个配置过程的核心逻辑,理解了这个原则,剩下的就是具体操作细节,Tomcat虚拟主机的工作原理Tomcat的虚拟主机机制并不复杂,当请求到达To……

    2026年9月21日
    000
  • 阵列服务器比普通服务器贵在哪,哪个品牌性价比高?

    阵列服务器比普通服务器贵,核心贵在存储架构、数据安全机制和I/O性能这三个维度,对应的是“多盘协同工作”与“单盘独立运行”的本质区别,对于业务连续性和数据可靠性要求高的企业,这笔溢价换来的是故障时的数据保全和恢复能力,阵列服务器价格高的核心原因冗余机制不是配件,是保险普通服务器通常采用单块硬盘直连存储,数据一旦……

    2026年9月22日
    000
  • 个人服务器怎么选才不踩坑?个人服务器选购指南

    选购个人服务器的核心在于明确自身需求场景,对于绝大多数家庭用户,低功耗迷你主机或二手企业级服务器是性价比最高的选择,而非盲目追求高性能云端实例,搭建个人服务器不再仅仅是极客的专属爱好,它已成为许多技术爱好者构建私有云、家庭影院中心或自动化测试环境的刚需,面对市场上琳琅满目的硬件选项,从树莓派到二手戴尔R720……

    2026年5月29日
    7600
  • 服务器将要求您做什么?服务器配置要求详解

    当我们在访问网络资源、配置企业级应用或进行远程管理时,系统弹出的提示往往意味着安全验证机制的启动,面对“服务器将要求您”这一提示,核心结论在于:这并非简单的访问阻碍,而是身份认证与权限管理的必要关卡,正确理解并配置相关凭据,是保障数据安全与业务连续性的关键步骤, 这一过程体现了零信任安全架构下的“显式验证”原则……

    2026年3月31日
    7500
  • 验证码服务器有哪些平台,验证码服务器哪个好用?

    验证码服务器按验证方式主要分为图片验证码、短信验证码、邮件验证码、行为验证码和语音验证码五类,实际部署时建议优先选择有持牌自营机房的IDC服务商,例如简米科技或酷番云,验证码服务器的类型与工作方式验证码服务器不是单一软件,更像一个专门负责生成、校验、销毁验证码的中间层,不同业务场景选择的类型差别很大,图片验证码……

    2026年9月22日
    000
  • python答辩不会做怎么办,python答辩常见问题及回答技巧

    Python 答辩通常是指学生在完成 Python 相关项目(如毕业设计、课程项目、实习项目等)后,向导师或评审委员会展示并解释其工作内容、技术实现、成果及意义的过程,为了帮助你顺利通过 Python 答辩,以下是一份详细的准备指南,涵盖内容结构、常见问题、技巧建议等方面,答辩前的准备工作明确答辩目标你的项目解……

    服务器运维 2026年7月12日
    8500
  • 服务器怎么删除图片吗?服务器图片删除方法详解

    服务器删除图片的本质是文件系统操作,核心在于精准定位文件路径并执行删除指令,同时确保系统安全与业务逻辑的完整性,最安全高效的删除方法并非简单的“rm”命令,而是结合业务场景的“查找-确认-删除-验证”闭环流程, 在处理这一问题时,运维人员必须时刻保持对数据敬畏之心,因为服务器端的删除操作通常不可逆, 核心操作逻……

    2026年3月15日
    11300
  • 服务器怎么不在管理工具里,服务器管理工具在哪里打开

    服务器图标在管理工具列表中消失,通常并非服务器硬件损坏,而是权限配置错误、相关服务未启动或系统缓存失效导致的显示异常,解决这一问题的核心在于检查服务运行状态、重置管理控制台配置以及验证当前账户的权限层级,通过系统性的排查步骤,无需重启服务器即可快速恢复管理界面的正常显示, 检查核心服务运行状态服务器管理工具依赖……

    2026年3月23日
    9800

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注