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()
函数,我们还可以使用自定义的JSONEncoder
和JSONDecoder
类来实现编码和解码的自定义逻辑。我们可以继承JSONEncoder
和JSONDecoder
类,并重写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