📅  最后修改于: 2023-12-03 15:04:19.258000             🧑  作者: Mango
在之前的文章中,我们了解了如何使用Python内置的json
库来将Python对象转换为JSON格式。但是如果想对自己的Python对象进行自定义JSON格式化的话,该怎么做呢?
Python提供了json.JSONEncoder
类来实现自定义对象的JSON序列化。我们只需要继承json.JSONEncoder
类,并在子类中重写default()
方法,将对象转换为一个可序列化的Python对象(如一个字典或一个列表),就可以实现自定义JSON格式化了。
下面来看一个例子,假设我们要将一个自定义的Person
类转换为JSON格式。这个Person
类包含姓名、年龄和性别三个属性。
import json
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
我们可以继承json.JSONEncoder
类,并在子类中重写default()
方法。default()
方法接收一个参数,即要被序列化的对象。
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "age": obj.age, "gender": obj.gender}
return json.JSONEncoder.default(self, obj)
在default()
方法中,我们首先检查要被序列化的对象是否是Person
类的实例。如果是的话,就将它转换为一个字典,并把字典作为返回值。如果不是的话,就调用父类的default()
方法。
接下来,我们就可以使用json.dumps()
方法将Person
对象转换为JSON格式了。
p = Person("Tom", 20, "male")
print(json.dumps(p, cls=PersonEncoder))
输出结果为:
{"name": "Tom", "age": 20, "gender": "male"}
这样,我们就成功地实现了自定义对象的JSON格式化。
需要注意的是,如果要反向将JSON字符串转换为Python对象,我们还需要实现一个相应的解码器。它的实现方式与编码器类似,只需要继承json.JSONDecoder
类,并在子类中重写decode()
方法。
class PersonDecoder(json.JSONDecoder):
def decode(self, s):
obj = json.loads(s)
if "name" in obj and "age" in obj and "gender" in obj:
return Person(obj["name"], obj["age"], obj["gender"])
return obj
在decode()
方法中,我们首先调用json.loads()
方法将JSON字符串转换为Python对象。然后检查这个对象是否符合Person
类的属性要求。如果符合的话,就将它构造为一个Person
对象并返回,否则直接返回原对象。
最后,我们可以使用json.loads()
方法将JSON字符串转换为Python对象。
s = '{"name": "Tom", "age": 20, "gender": "male"}'
p = json.loads(s, cls=PersonDecoder)
print(p.name, p.age, p.gender)
输出结果为:
Tom 20 male
这样,我们就可以方便地进行自定义对象的JSON序列化和反序列化了。