Marshmallow 是一个用于序列化和反序列化复杂数据类型(例如对象)到 Python 原生数据类型(如字典、列表)的库,同时它也提供数据验证功能。在许多 Flask 项目中,Marshmallow 常用于处理 JSON 请求和响应数据的验证和格式化。
marshmallow是一个用来将复杂的orm对象与python原生数据类型之间相互转换的库,简而言之,就是实现:
object -> dict,object -> json string,object -> list
json string -> dict,json string -> list,json string -> object
dict -> object,list -> object。
marshmallow在反序列化(dict/str/list->object)的时候,可以进行数据字段的校验。因此数据校验仅仅是marshmallow的附加功能。
Schemas
在 Marshmallow 中,Schema
用于定义数据的结构和验证规则。每个 Schema
包含一系列的字段(Field),这些字段定义了数据应该如何被序列化(转换成 JSON)和反序列化(从 JSON 转换回 Python 数据类型)。
Fields
字段是 Schema
的基本组成部分,代表数据的一个属性。Marshmallow 提供了许多内置的字段类型,例如 String
、Integer
、DateTime
等,每种字段类型都有自己的验证器和处理逻辑。
基本使用
- 定义 Schema:首先,你需要定义一个
Schema
类,指定想要序列化/反序列化的数据结构。
from marshmallow import Schema, fields
class UserSchema(Schema):
username = fields.Str(required=True)
email = fields.Email(required=True)
age = fields.Integer(required=True, validate=lambda val: val > 0)
在这个例子中,我们定义了一个 UserSchema
,它有三个字段:username
、email
和 age
。required=True
表示这些字段是必须的,validate
参数用于指定一个验证函数。
- 序列化:使用
dump()
或dumps()
方法将 Python 对象转换成字典或 JSON 字符串。
user_data = {
'username': 'johndoe',
'email': 'john.doe@example.com',
'age': 25
}
schema = UserSchema()
result = schema.dump(user_data)
print(result) # 输出序列化后的字典
- 反序列化:使用
load()
或loads()
方法将输入的数据(一般是 JSON 格式)转换成 Python 对象。
input_data = {
'username': 'janedoe',
'email': 'jane.doe@example.com',
'age': 22
}
schema = UserSchema()
result = schema.load(input_data)
print(result) # 输出反序列化后的字典
如果输入数据不符合定义的 Schema,load()
方法将抛出 ValidationError
。
- 验证:
Schema
还可以用来验证数据。如果数据无效,可以捕获ValidationError
并处理错误。
try:
result = schema.load({'username': 'johndoe', 'email': 'not-an-email', 'age': 25})
except ValidationError as err:
print(err.messages) # 输出错误信息
进阶使用
Marshmallow 还允许自定义验证函数、使用函数或方法进行字段的后处理、处理复杂的嵌套结构、支持字段的默认值和缺失值处理等。
通过使用 Marshmallow,你可以构建强大而灵活的数据处理逻辑,同时确保 API 与外部系统交互时的数据的有效性和一致性。