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_onlyload_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

相关推荐

  • FTP授时服务器软件怎么配置,在哪里下载?

    FTP授时服务器软件凭借其简单的部署方式和广泛的兼容性,在无法使用NTP协议的特殊环境中,成为时间同步的可靠选择,FTP授时服务器软件的核心原理与适用场景FTP授时服务器软件的工作原理并不复杂:服务器端通过FTP服务提供一份包含精确时间戳的文本文件,客户端定时下载该文件,解析出时间信息并同步本地系统时钟,与NT……

    2026年7月30日
    500
  • 个人如何制作网站?零基础建站教程有哪些

    从部署到上线的完整路径选定工具和基础设施后,进入实质性的搭建阶段,以下以主流的WordPress建站为例,梳理标准操作流程,第一步:环境部署与程序安装购买并配置服务器:在云服务商控制台创建实例,设置强密码,并在安全组中开放80(HTTP)和443(HTTPS)端口,安装运行环境:对于新手,推荐使用宝塔面板(BT……

    2026年5月31日
    4800
  • 服务器接入商是什么?如何查询服务器接入商信息

    服务器接入商是指为企业或个人提供服务器托管、带宽接入及网络基础设施服务的专业服务商,其核心价值在于保障网络稳定性与数据安全性,核心结论:服务器接入商是网络基础设施的关键节点服务器接入商通过提供机房环境、网络带宽、硬件维护等服务,确保用户服务器高效运行,其服务直接影响网站访问速度、数据安全及业务连续性,选择可靠的……

    2026年3月11日
    9100
  • 个人动态ip域名过期怎么办?域名过期后怎么续费

    个人动态IP域名过期后,若未及时处理,会导致网站无法访问、SEO权重迅速流失及潜在的安全风险,建议立即续费或迁移至稳定服务器以恢复服务,当你的个人动态IP域名显示过期状态时,这不仅仅是一个简单的技术故障,更是一场关于数据资产保全的紧急战役,动态IP本身具有不稳定性,而域名的过期则彻底切断了用户与服务器之间的信任……

    2026年6月13日
    3300
  • 明日之后oppo渠道服有哪些服务器,怎么下载?

    明日之后OPPO渠道服目前主要服务器包括:远星城、快乐101、密斯卡镇、多贝雪山、红杉镇、白树高地、茅斯沼泽、黑珍珠港、联盟总部、圣托帕尼、西奥多、莱文市、灰烬山庄等,此为部分列表,完整服务器以游戏内角色创建界面显示为准,且会随版本更新开放新服,服务器列表与选择策略OPPO渠道服完整服务器列表根据官方公开信息……

    2026年8月13日
    500
  • 高级威胁检测系统新年活动有哪些?高级威胁检测系统新年优惠活动靠谱吗

    2026年高级威胁检测系统新年活动不仅是企业降低安全采购成本的黄金窗口,更是应对AI深度伪造与无文件攻击等新型威胁、实现防御体系代际跨越的战略级入场券,2026新年活动:安全预算的破局点采购成本与授权模式的双重优化面对经济周期波动,企业安全预算愈发审慎,本次高级威胁检测系统新年活动直击痛点,打破传统高昂的授权壁……

    2026年4月26日
    5800
  • 你知道十大服务器品牌有哪些吗?,哪个品牌性价比高?

    如果从市场占有率、技术话语权和行业认可度三个维度来看,全球十大服务器品牌以戴尔、浪潮信息、HPE(慧与)、超微、联想、华为、思科、IBM、新华三、甲骨文为第一梯队;面向国内中小企业和站长场景,酷番云等持牌云服务商正以合规性和高性价比强势补位,以下是基于第三方机构Gartner与IDC公开数据口径、结合国内政企采……

    2026年8月22日
    300
  • URL可以访问哪些服务器?常见的服务器有哪些?

    URL通过DNS解析将域名翻译为具体IP地址,最终访问的是该IP所指向的服务器(或服务器集群),包括Web服务器、CDN节点、负载均衡器、对象存储桶,乃至源站数据库前层的应用服务器,具体取决于URL的域名和路径设计,URL与服务器之间的映射逻辑很多人以为输入网址后直接连上了某台“神秘主机”,实际上URL只是人类……

    2026年8月18日
    700
  • 个人如何注册域名?注册域名需要哪些条件和流程

    个人注册域名只需选定心仪名称、选择正规注册商并完成实名认证,通常耗时不到半小时,费用在几十至百元不等,是搭建个人网站或品牌保护的第一步,在数字化浪潮席卷全球的今天,拥有一个属于自己的域名,就像是在互联网世界中买下了一块专属的“数字地产”,对于许多初次接触网络建设的个人用户来说,面对琳琅满目的域名后缀和复杂的注册……

    服务器运维 2026年6月6日
    5500
  • 防护系统如何正确选择,哪个品牌性价比更高?

    选防护系统,先看需求场景再定品牌功能,没有万能方案,只有匹配度最高的组合,这是很多人在百度搜索“防护系统如何”时最想得到的答案,防护系统这个词涵盖面很广,可能是企业网络安全防护,也可能是工地安全防护,还可能是个人隐私防护,本文以最常见的企业网络安全防护系统为主线,结合不同场景下的选择逻辑,帮你理清思路,防护系统……

    2026年8月10日
    500

发表回复

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