Python3 对象序列化为 JSON

在Python中,我们经常需要将数据从一种格式转换为另一种格式,比如将对象序列化为JSON格式。JSON(JavaScript Object Notation)是一种常用的数据交换格式,它使用文本表示结构化的数据,是一种轻量级的数据交换格式。

什么是JSON?

JSON是一种基于键值对的数据表示方式,它由两种结构组成:键值对和数组。键值对由一个字符串作为键,后面跟着一个冒号和一个值。数组是一组值,用方括号包围。JSON的值可以是字符串、数字、布尔值、null、对象或数组。

下面是一个JSON的例子:

{
  "name": "Tom",
  "age": 25,
  "is_student": true,
  "courses": ["Math", "English", "History"]
}

Python中的JSON模块

Python中提供了一个内置的json模块,用于处理JSON数据的编码和解码。json模块提供了一些函数来处理JSON数据,包括将Python对象编码为JSON字符串的dumps()函数和将JSON字符串解码为Python对象的loads()函数。

将Python对象序列化为JSON

要将Python对象序列化为JSON格式,我们可以使用json模块的dumps()函数。下面是一个示例:

import json

# 定义一个Python对象
person = {
    "name": "Tom",
    "age": 25,
    "is_student": True,
    "courses": ["Math", "English", "History"]
}

# 将Python对象序列化为JSON字符串
json_str = json.dumps(person)

print(json_str)

输出结果为:

{"name": "Tom", "age": 25, "is_student": true, "courses": ["Math", "English", "History"]}

在上面的示例中,我们首先定义了一个Python对象person,然后使用json.dumps()将其序列化为JSON字符串。最后,我们通过print()函数将JSON字符串输出到控制台。

将JSON字符串反序列化为Python对象

要将JSON字符串反序列化为Python对象,我们可以使用json模块的loads()函数。下面是一个示例:

import json

# 定义一个JSON字符串
json_str = '{"name": "Tom", "age": 25, "is_student": true, "courses": ["Math", "English", "History"]}'

# 将JSON字符串反序列化为Python对象
person = json.loads(json_str)

print(person)

输出结果为:

{
    "name": "Tom",
    "age": 25,
    "is_student": True,
    "courses": ["Math", "English", "History"]
}

在上面的示例中,我们首先定义了一个JSON字符串json_str,然后使用json.loads()将其反序列化为Python对象。最后,我们通过print()函数将Python对象输出到控制台。

使用JSONEncoder和JSONDecoder自定义编码和解码

除了使用dumps()loads()函数,我们还可以使用自定义的JSONEncoderJSONDecoder类来实现编码和解码的自定义逻辑。我们可以继承JSONEncoderJSONDecoder类,并重写default()object_hook()方法来实现自定义逻辑。

下面是一个示例:

import json

# 自定义JSON编码器
class PersonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Person):
            return {
                "name": obj.name,
                "age": obj.age,
                "is_student": obj.is_student,
                "courses": obj.courses
            }
        return super().default(obj)

# 自定义JSON解码器
class PersonDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        if "name" in dct:
            return Person(
                dct["name"],
                dct["age"],
                dct["is_student"],
                dct["courses"]
            )
        return dct

# 定义一个Person类
class Person:
    def __init__(self, name, age, is_student, courses):
        self.name = name
        self.age = age
        self.is_student = is_student
        self.courses = courses

# 定义一个Person对象
person = Person("Tom", 25, True, ["Math", "English", "History"])

# 将Person对象编码为JSON字符串
json_str = json.dumps