用途:
转换格式
string–object–string互相转换
- 定义 Scheme
from datetime import datetime
class User():
def __init__(self, name, email):
self.name = name
self.email = email
self.created_at = datetime.now()
需要创建一个对应的 Schema 类来实现该类对象的序列化和反序列化:
from marshmallow import Schema, fields
class UserSchema(Schema):
name = fields.Str()
email = fields.Email()
created_at = fields.DateTime()
创建 Schema 类时,其中的字段必须与原始类中的命名一致,否则该字段将不会序列化和反序列化。
- 序列化
使用 Schema 类的 dump() 来完成 obj -> dict 的转换,或者使用 dumps() 方法来完成 obj -> string 的转换。
from marshmallow import pprint
user = User(name="Monty", email="monty@python.org")
schema = UserSchema()
result = schema.dump(user)
pprint(result)
json_result = schema.dumps(user)
pprint(json_result)
from pprint import pprint
user_data = {
'created_at': '2014-08-11T05:26:03.869245',
'email': 'ken@yahoo.com',
'name': 'Ken'
}
schema = UserSchema()
result = schema.load(user_data)
pprint(result)
3.反序列化
可使用 Schema 类的 load() 来完成 dict -> dict 的转换,或者使用 loads() 方法来完成 string -> dict 的转换。注意这里的转换结果默认都是 dict,这个 dict 跟原始的 dict 不一样,只会包含 Schema 类里有定义的字段。
from pprint import pprint
user_data = {
'created_at': '2014-08-11T05:26:03.869245',
'email': 'ken@yahoo.com',
'name': 'Ken'
}
schema = UserSchema()
result = schema.load(user_data)
pprint(result)
如果要实现 dict -> obj 或 string -> obj 转换,需要在 Schema 类中额外定义一个 post_load 装饰器方法。
from marshmallow import Schema, fields, post_load
class UserSchema(Schema):
name = fields.Str()
email = fields.Email()
created_at = fields.DateTime()
@post_load
def make_user(self, data):
return User(**data)
from pprint import pprint
user_data = {
'email': 'ken@yahoo.com',
'name': 'Ken'
}
schema = UserSchema()
result = schema.load(user_data)
pprint(result)
4.处理对象列表
只需要在 load 和 dump 时指定参数 many=True 即可。
from marshmallow import pprint
user1 = User(name="Mick", email="mick@stones.com")
user2 = User(name="Keith", email="keith@stones.com")
users = [user1, user2]
schema = UserSchema(many=True)
result = schema.dump(users)
pprint(result)
schema = UserSchema()
result = schema.dump(users, many=True)
pprint(result)