一、MarshMallow 简介
MarshMallow 是一个 Python 序列化和反序列化库,可以将 Python 对象转换为 JSON(JavaScript Object Notation)格式,也可以将 JSON 格式转换为 Python 对象。该库的使用可以让开发者在 Python 代码中方便地处理 JSON 数据。
二、MarshMallow 的安装
MarshMallow 的安装非常简单,只需要使用 pip 工具即可:
pip install marshmallow
三、MarshMallow 的基本用法
1. 编写 Schema
MarshMallow 中的 Schema 用于定义数据结构,包括字段名称、类型、校验规则等信息。
以下是一个简单的 Schema 示例:
from marshmallow import Schema, fields
class UserSchema(Schema):
id = fields.Int()
name = fields.Str()
email = fields.Email()
在上面的示例中,定义了一个 UserSchema,包括 id、name、email 三个字段,它们的类型分别是 int、str 和 email。
2. 将 Python 对象转换为 JSON 字符串
MarshMallow 可以将 Python 对象转换为 JSON 字符串。下面是一个简单的示例:
from marshmallow import Schema, fields, pprint
class UserSchema(Schema):
id = fields.Int()
name = fields.Str()
email = fields.Email()
user_data = {
"id": 1,
"name": "Tom",
"email": "tom@example.com"
}
user_schema = UserSchema()
result = user_schema.dump(user_data)
pprint(result)
以上示例中,通过 dump() 方法将 Python 对象 user_data 转换为 JSON 字符串。
输出结果如下:
{
'email': 'tom@example.com',
'id': 1,
'name': 'Tom'
}
3. 将 JSON 字符串转换为 Python 对象
MarshMallow 还可以将 JSON 字符串转换为 Python 对象。下面是一个简单的示例:
from marshmallow import Schema, fields, pprint
class UserSchema(Schema):
id = fields.Int()
name = fields.Str()
email = fields.Email()
json_data = '{"id": 1, "name": "Tom", "email": "tom@example.com"}'
user_schema = UserSchema()
result = user_schema.loads(json_data)
pprint(result)
以上示例中,通过 loads() 方法将 JSON 字符串 json_data 转换为 Python 对象。
输出结果如下:
{
'email': 'tom@example.com',
'id': 1,
'name': 'Tom'
}
4. 导出 JSON Schema
MarshMallow 还可以将 Schema 导出为 JSON Schema 格式。
from marshmallow import Schema, fields, pprint
class UserSchema(Schema):
id = fields.Int()
name = fields.Str()
email = fields.Email()
user_schema = UserSchema()
print(user_schema.dumps())
以上示例中,通过 dumps() 方法将 UserSchema 导出为 JSON Schema 格式。
输出结果如下:
{
"$schema": "http://json-schema.org/schema#",
"properties": {
"email": {
"type": "string",
"format": "email"
},
"id": {
"type": "integer"
},
"name": {
"type": "string"
}
},
"type": "object",
"required": ["id", "name", "email"]
}
四、MarshMallow 的进阶用法
1. 处理嵌套对象
MarshMallow 也支持处理嵌套的对象。以下是一个简单的示例:
from marshmallow import Schema, fields, pprint
class AddressSchema(Schema):
country = fields.Str()
province = fields.Str()
city = fields.Str()
class UserSchema(Schema):
id = fields.Int()
name = fields.Str()
email = fields.Email()
address = fields.Nested(AddressSchema)
user_data = {
"id": 1,
"name": "Tom",
"email": "tom@example.com",
"address": {
"country": "China",
"province": "Jiangsu",
"city": "Nanjing"
}
}
user_schema = UserSchema()
result = user_schema.dump(user_data)
pprint(result)
以上示例中,UserSchema 中包含了一个嵌套的 AddressSchema 对象。
输出结果如下:
{
'address': {
'city': 'Nanjing',
'country': 'China',
'province': 'Jiangsu'
},
'email': 'tom@example.com',
'id': 1,
'name': 'Tom'
}
2. 处理多态对象
MarshMallow 还可以处理多态对象,以下是一个简单的示例:
from marshmallow import Schema, fields, pprint
class PetSchema(Schema):
name = fields.Str()
class DogSchema(PetSchema):
bark = fields.Str()
class CatSchema(PetSchema):
meow = fields.Str()
class PersonSchema(Schema):
name = fields.Str()
pet = fields.Nested(PetSchema, many=True)
person_data = {
"name": "Tom",
"pet": [
{"name": "Jackie", "bark": "Woof!"},
{"name": "Lily", "meow": "Meow!"}
]
}
person_schema = PersonSchema()
result = person_schema.dump(person_data)
pprint(result)
以上示例中,PersonSchema 中包含了一个 pet 对象,它既可以是 DogSchema 类型,也可以是 CatSchema 类型。
输出结果如下:
{
'name': 'Tom',
'pet': [
{'bark': 'Woof!', 'name': 'Jackie'},
{'meow': 'Meow!', 'name': 'Lily'}
]
}
3. 处理日期和时间
MarshMallow 还可以处理日期和时间类型,以下是一个简单的示例:
import datetime
from marshmallow import Schema, fields
class DateSchema(Schema):
date = fields.Date()
date_data = {
"date": datetime.date.today()
}
date_schema = DateSchema()
result = date_schema.dump(date_data)
print(result)
输出结果如下:
{
'date': '2021-03-30'
}
总结
本文介绍了 Python 序列化和反序列化库 MarshMallow 的基本用法和进阶用法,包括如何编写 Schema、将 Python 对象转换为 JSON 字符串、将 JSON 字符串转换为 Python 对象、导出 JSON Schema、处理嵌套对象、处理多态对象以及处理日期和时间类型。