Python 序列化和反序列化库 MarshMallow 的用法实例代

一、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、处理嵌套对象、处理多态对象以及处理日期和时间类型。

后端开发标签