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://test.idctop.com/article/477555.html

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

相关推荐

  • 服务器提示内存分配不足怎么办?内存不足的解决方法

    服务器提示内存分配不足,本质上意味着系统可用内存资源已无法满足当前运行进程或新任务的请求,这是服务器运维中极具破坏性的故障信号,直接导致服务崩溃、进程僵死甚至系统宕机,解决该问题的核心逻辑在于“开源”与“节流”双管齐下:既要通过物理扩容和参数调优增加可用内存上限,又要通过代码优化和进程管理减少不必要的内存占用……

    2026年3月8日
    11600
  • 嘉兴物流服务器租用月租多少?,哪家更便宜?

    嘉兴物流服务器租用月租通常在800元至3000元之间,具体取决于配置、带宽和机房级别,这个价格范围覆盖了从初创物流团队到中型企业的大部分需求,你完全可以根据实际业务量灵活调整,避免初期投入过高,嘉兴物流服务器租用月租多少钱?价格区间与配置对比先直接看价格,再谈配置,这样心里更有底,嘉兴本地机房提供的物流服务器方……

    2026年8月13日
    400
  • 服务器和客户端如何传对象呢,有哪些方式?

    不直接传内存中的对象,而是通过序列化把对象转成JSON或二进制流,经HTTP或自定义协议传输,到达对端后再反序列化还原,这套机制是前后端分离架构和分布式系统的基础,但选型、性能优化和跨语言兼容性之间存在大量细节,下面逐一拆解,服务器和客户端传对象到底在传什么东西刚开始接触前后端协作的开发者,往往会产生一个直觉疑……

    服务器运维 2026年8月9日
    400
  • 个人博客网站虚拟主机多大够用?虚拟主机容量选择指南

    个人博客网站虚拟主机的大小并非固定不变,通常建议起步选择10GB-20GB的存储空间,配合1-2核CPU和1-2GB内存的配置,足以满足绝大多数文字和图片为主的轻量级博客需求,选择虚拟主机时,很多新手容易陷入“越大越好”的误区,或者为了省钱选择极度压缩的配置,导致网站打开缓慢甚至崩溃,虚拟主机的容量与性能需要匹……

    2026年6月13日
    3210
  • 服务器如何彻底杀毒?2026最新安全防护方案

    服务器杀毒服务器是企业的核心命脉,承载着关键业务、敏感数据和用户访问,服务器一旦感染病毒或恶意软件,其破坏力远超个人电脑,可能导致业务瘫痪、数据泄露、信誉崩塌甚至巨额经济损失,专业、精准、持续的服务器杀毒防护不是可选项,而是企业安全运营的生命线, 服务器病毒威胁:远超想象的破坏力服务器面临的恶意软件类型复杂且危……

    服务器运维 2026年2月15日
    15000
  • 防火墙应用的主要指标为

    防火墙应用的核心性能与效能指标深度解析防火墙应用的核心性能指标主要包括:吞吐量、延迟、并发连接数、新建连接速率、安全策略有效性、资源利用率、高可用性以及管理便捷性, 这些指标共同决定了防火墙在实际网络环境中的防护能力、业务支撑水平和运维效率,是选型、部署、调优及评估防火墙的关键依据, 网络性能基石:吞吐量与延迟……

    2026年2月5日
    13700
  • 服务器岗位具体是做什么的?服务器运维工程师职责详解

    服务器岗位的核心价值在于保障业务连续性与数据资产安全,其职能已从单纯的硬件维护演变为企业数字化转型的基石,这一岗位不仅要求从业者具备扎实的网络与系统底层知识,更需具备快速响应突发故障的应急处理能力与前瞻性的架构优化思维, 在当前云计算与人工智能飞速发展的背景下,服务器岗位的技术门槛正在显著提高,企业对该角色的依……

    2026年4月6日
    9200
  • 服务器怎么安装硬盘?服务器安装硬盘详细步骤与注意事项

    高效稳定部署的四大关键步骤与实操要点在企业IT基础设施升级或扩容中,服务器安装硬盘是高频且关键的操作环节,操作不当易导致数据丢失、性能瓶颈甚至硬件损坏,本文基于一线运维经验与主流厂商规范(如Dell PowerEdge、HPE ProLiant、Huawei EulerOS兼容平台),系统梳理服务器安装硬盘的标……

    服务器运维 2026年4月16日
    8000
  • 分组管理员怎么添加新成员,怎么设置权限?

    分组管理员是企业级管理软件中用于分权管理的关键角色,通过设置分组管理员,企业可以在实现精细权限管控的同时,提升组织协同效率并降低安全风险,分组管理员怎么设置设置分组管理员的第一步是登录管理后台,进入权限管理模块,不同平台的操作路径略有差异,但核心逻辑一致:先确定管理范围,再分配具体权限,以企业微信为例,路径如下……

    2026年7月19日
    1000
  • 服务器异常告警功能是什么?服务器报警设置方法

    构建高效稳定的服务器异常告警功能体系,是保障业务连续性与数据安全性的核心防线,其价值在于将被动的故障修复转变为主动的风险干预,最大限度降低系统宕机带来的经济损失,一个成熟的告警体系,必须具备精准的异常识别能力、毫秒级的响应速度以及低误报率的特征,确保运维团队能够在故障发生的“黄金时间窗口”内介入处理,服务器异常……

    2026年3月25日
    9000

发表回复

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