📜  Python-Json 5 : python自定义class进行Json格式化(1)

📅  最后修改于: 2023-12-03 15:04:19.258000             🧑  作者: Mango

Python-Json 5 : python自定义class进行Json格式化

在之前的文章中,我们了解了如何使用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序列化和反序列化了。