序列化(Serialization)指的是将数据结构或对象状态转换为可以存储或传输的格式的过程。其中,将数据转换成JSON格式是常见的序列化方式之一。Python 中提供了通用的序列化模块 json
来实现将数据转换为JSON格式,其中也包括对象的序列化操作。
下面是将 Python 类对象序列化为 JSON 的完整操作步骤:
- 导入 JSON 模块
json
模块是 Python 内置的模块,使用前需要导入。在 Python 中通过以下代码导入 json
模块:
python
import json
- 定义类对象及其实例化对象
定义需要序列化的类及其实例化对象,例如以下代码一个Person
类定义了一个人名和年龄属性:
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('Tom', 12)
- 自定义JSON编码函数
json
模块不能直接将 Python 类对象序列化为 JSON 格式,需要先对类对象进行自定义的编码,将其转换为 json.dumps()
函数可以接受的 Python 数据结构:例如 list
、dict
等。
自定义的编码函数需要调用 json.JSONEncoder()
类中的具体方法进行编码。例如以下代码自定义了一个编码函数 encode_person
:
```python
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {'name': obj.name, 'age': obj.age}
return json.JSONEncoder.default(self, obj)
def encode_person(person):
return json.dumps(person, cls=PersonEncoder)
```
此处定义的编码函数将 Person
对象编码成一个包含 name
和 age
两个属性的字典(dict)。
- 序列化对象
最后将 Python 对象转化为 JSON 对象即可。使用 json.dumps()
函数完成对象的序列化操作,代码如下:
python
person_json = encode_person(p)
print(person_json) # 输出:{"name": "Tom", "age": 12}
在执行序列化操作时,需要进行自定义编码的类对象要作为 json.dumps()
函数的参数 cls
传给函数。
下面展示两个示例:
示例1:将多种数据类型放入对象中
定义一个包含列表和元组的对象:
class Data:
def __init__(self):
self.items = [1, 2, 3]
self.coords = (10, 20, 30)
可以定义一个自定义编码函数,将列表和元组按照其类型转换为不同的JSON格式。代码如下:
class DataEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Data):
return {'items': obj.items, 'coords': ','.join(map(str, obj.coords))}
return super().default(obj)
def encode_data(data):
return json.dumps(data, cls=DataEncoder)
然后创建Data实例,将其序列化:
data = Data()
json_data = encode_data(data)
print(json_data) # 输出:{"items": [1, 2, 3], "coords": "10,20,30"}
示例2:将嵌套对象序列化为JSON
定义一个嵌套结构的对象:
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
class Person:
def __init__(self, name, age, car):
self.name = name
self.age = age
self.car = car
使用自定义编码函数将嵌套对象序列化:
class CarEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Car):
return {'make': obj.make, 'model': obj.model, 'year': obj.year}
return super().default(obj)
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {'name': obj.name, 'age': obj.age, 'car': obj.car}
return super().default(obj)
def encode_person(person):
return json.dumps(person, cls=PersonEncoder, indent=4)
car = Car('Nissan', 'GT-R', 2020)
person = Person('Tom', 12, car)
json_person = encode_person(person)
print(json_person)
输出为:
{
"name": "Tom",
"age": 12,
"car": {
"make": "Nissan",
"model": "GT-R",
"year": 2020
}
}
即成功将嵌套对象序列化为 JSON 格式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在Python 中将类对象序列化为JSON - Python技术站