Marshmallow,你的序列化小帮手
听说过 Marshmallow 吗?它是个超级实用的 Python 数据处理库,专门处理数据序列化和反序列化。说白了就是把 Python 对象转成 JSON、把 JSON 转回 Python 对象。对接口开发和数据处理来说,简直是神器啊!
1.
基本用法先来一套
要用 Marshmallow,得先装一下:
pip install marshmallow
来看个最简单的例子:
from marshmallow import Schema, fields
class UserSchema(Schema):
name = fields.Str()
age = fields.Int()
email = fields.Email()
# 假装这是从数据库拿到的数据
user_data = {
“name”: “小明”,
“age”: 18,
}
schema = UserSchema()
result = schema.dump(user_data)
print(result) # 输出序列化后的数据
温馨提示:fields.Email() 会自动帮你验证邮箱格式,写错了直接报错,贼方便!
2.
数据验证有点东西
说实话,数据验证是最烦人的,写一堆 if else 看着就头大。用 Marshmallow 能省不少事:
from marshmallow import Schema, fields, validate
class ProductSchema(Schema):
name = fields.Str(required=True, validate=validate.Length(min=2))
price = fields.Float(validate=validate.Range(min=0))
category = fields.Str(validate=validate.OneOf(['电子', '服装', '食品']))
# 试试看验证
bad_product = {
“name”: “a”, # 太短了
“price”: -10, # 价格不能为负
“category”: “玩具” # 类别不对
}
schema = ProductSchema()
errors = schema.validate(bad_product)
print(errors) # 看看哪些地方出错了
3.
嵌套结构也不怕
真实项目里数据结构都挺复杂的,好在 Marshmallow 对付起来也不含糊:
class AddressSchema(Schema):
street = fields.Str()
city = fields.Str()
class UserSchema(Schema):
name = fields.Str()
addresses = fields.List(fields.Nested(AddressSchema))
user = {
“name”: “老王”,
“addresses”: [
{“street”: “幸福路”, “city”: “北京”},
{“street”: “快乐街”, “city”: “上海”}
]
}
schema = UserSchema()
print(schema.dump(user))
4.
自定义字段处理
有时候想对数据做点特殊处理,比如把时间戳转成日期格式:
from marshmallow import Schema, fields, post_load
from datetime import datetime
class EventSchema(Schema):
@post_load
def make_datetime(self, data, **kwargs):
return data
event = {
“title”: “下班”,
}
schema = EventSchema()
print(schema.load(event))
温馨提示:post_load 装饰器超好用,可以在数据加载后自动处理。还有 pre_load、post_dump 这些,都能玩出花来。
要是想要把数据部分加载,只要在 Schema 里加个only或exclude参数就完事了。经常有人问我怎么只序列化某几个字段,这就是答案!
写接口的时候,经常要处理各种数据格式转换,验证数据合法性。要是每次都手写,代码又臭又长。用 Marshmallow 能让代码整洁不少,而且 bug 也少了。
记得多看官方文档,里面还有好多骚操作等着你去发现呢!看完文档,你就是序列化专家了~
领取专属 10元无门槛券
私享最新 技术干货