Python 之 Json序列化嵌套类方式

  • Post category:Python

当我们使用Python处理JSON数据时,可能会遇到一些JSON数据包含嵌套对象或类的情况,这时候就需要使用JSON序列化嵌套类的方式来处理这种情况。下面是该过程的完整攻略:

1. 定义嵌套类

首先,我们需要定义包含嵌套类的类对象,例如:

class Person:
    def __init__(self, name, age, address):
        self.name = name
        self.age = age
        self.address = address

class School:
    def __init__(self, name, location, teachers):
        self.name = name
        self.location = location
        self.teachers = teachers

class Student:
    def __init__(self, name, age, school):
        self.name = name
        self.age = age
        self.school = school

这里定义了三个类,Person类表示一个人的信息,School类表示学校的信息,Student类表示一个学生的信息,其中Student类包含一个School类对象。

2. 实例化对象

接着,我们需要实例化这些对象并建立关联关系,例如:

teacher1 = Person('张三', 35, '上海')
teacher2 = Person('李四', 42, '北京')
teachers = [teacher1, teacher2]

school = School('清华大学', '北京', teachers)

student = Student('小明', 18, school)

这里实例化了两个Person类对象作为老师的信息,然后将它们放入一个列表中,实例化了一个School类对象,并将老师列表作为其属性值之一,最后实例化了一个Student类对象,并将School对象作为其属性值之一。

3. 使用JSON序列化

最后,我们可以使用Python内置模块json序列化嵌套类的方式将上述对象转化为JSON格式,例如:

import json

class PersonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Person):
            return {'name': obj.name, 'age': obj.age, 'address': obj.address}
        return json.JSONEncoder.default(self, obj)

class SchoolEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, School):
            return {'name': obj.name, 'location': obj.location, 'teachers': obj.teachers}
        return json.JSONEncoder.default(self, obj)

class StudentEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Student):
            return {'name': obj.name, 'age': obj.age, 'school': json.dumps(obj.school, cls=SchoolEncoder)}
        return json.JSONEncoder.default(self, obj)

student_json = json.dumps(student, cls=StudentEncoder)

print(student_json)

这里定义了三个自定义编码器类,分别用于将Person类、School类和Student类对象转化为JSON格式。对于Student类,我们需要使用json.dumps()函数将它包含的School类对象转化为JSON格式,这里还需要使用SchoolEncoder类来处理。最终打印出的student_json变量包含了完整的嵌套类的JSON数据,例如:

{"name": "小明", "age": 18, "school": "{\"name\": \"清华大学\", \"location\": \"北京\", \"teachers\": [{\"name\": \"张三\", \"age\": 35, \"address\": \"上海\"}, {\"name\": \"李四\", \"age\": 42, \"address\": \"北京\"}]]}"}

示例说明

下面是两个示例说明:

示例1

假设我们有两个Person类对象,表示两个人的信息:

person1 = Person('张三', 35, '上海')
person2 = Person('李四', 42, '北京')

然后我们将它们放入一个列表中,表示某个团队的人员信息:

team = [person1, person2]

最后,我们将整个列表使用JSON序列化嵌套类方式转化为JSON格式,例如:

team_json = json.dumps(team, cls=PersonEncoder)
print(team_json)

这里使用PersonEncoder类将Person类对象转化为JSON格式,打印出的team_json变量包含了完整的嵌套类的JSON数据,例如:

[{"name": "张三", "age": 35, "address": "上海"}, {"name": "李四", "age": 42, "address": "北京"}]

示例2

假设我们有一个Book类和一个Library类,表示一本书和一个图书馆的信息:

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

class Library:
    def __init__(self, name, books):
        self.name = name
        self.books = books

然后我们实例化两个Book对象和一个Library对象,表示一个图书馆的信息:

book1 = Book('Python基础教程', 'Magnus Lie Hetland')
book2 = Book('Python CookBook', 'David Beazley')

books = [book1, book2]

library = Library('清华大学图书馆', books)

最后,我们将整个Library对象使用JSON序列化嵌套类方式转化为JSON格式,例如:

library_json = json.dumps(library, cls=LibraryEncoder)
print(library_json)

这里使用LibraryEncoder类将Library类对象转化为JSON格式,打印出的library_json变量包含了完整的嵌套类的JSON数据,例如:

{"name": "清华大学图书馆", "books": [{"title": "Python基础教程", "author": "Magnus Lie Hetland"}, {"title": "Python CookBook", "author": "David Beazley"}]}

在这个示例中,Library类对象包含了一个列表,它的元素是Book类对象,我们成功地将嵌套的类都转化成了JSON格式的数据。