针对该问题,我准备讲解“Python如何把不同类型数据的JSON序列化”的完整攻略。
什么是JSON序列化
JSON序列化是将数据从Python对象转化为JSON格式的过程。在Python中,我们可以使用json
模块来进行JSON序列化,该模块提供了dump()
, dumps()
, load()
, 和loads()
这四个方法来完成序列化和反序列化。
如何把不同类型数据的JSON序列化
下面,我们就来 整理一下如何把不同类型数据的JSON序列化的攻略,主要分为以下几个步骤:
- 下载和导入json模块
首先,我们需要下载和导入json
模块,Python内置该模块,因此不需要进行额外安装。
python
import json
- 序列化简单数据类型
序列化简单数据类型,包括字符串、数字、列表、元组和布尔值等,可以直接调用dumps()
方法来完成,如下所示:
“`python
# 序列化字符串类型
name = “Tom”
name_str = json.dumps(name)
# 序列化数字类型
age = 18
age_str = json.dumps(age)
# 序列化列表类型
hobby = [“reading”, “swimming”, “jogging”]
hobby_str = json.dumps(hobby)
# 序列化元组类型
scores = (80, 90, 95)
scores_str = json.dumps(scores)
# 序列化布尔类型
is_male = True
is_male_str = json.dumps(is_male)
“`
- 序列化自定义数据类型
序列化自定义数据类型,需要使用JSONEncoder对Python对象进行编码,在此之前,需要先定义一个自定义编码器,继承JSONEncoder对象,并重写default()
方法。示例如下:
“`python
class Cat:
def init(self, name, age):
self.name = name
self.age = age
class CatEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Cat):
return {“name”: obj.name, “age”: obj.age}
return super().default(obj)
“`
确定好编码器后,我们就可以序列化自定义数据类型,如下所示:
python
# 序列化自定义数据类型
kitty = Cat("Mimi", 2)
kitty_str = json.dumps(kitty, cls=CatEncoder)
这里我们明确指明了编码器cls=CatEncoder
,进行序列化。
- 序列化带日期对象的数据类型
当Python对象中包含日期对象时,我们可以将日期对象转化成字符串来完成JSON序列化。Python中,通常使用datetime模块中的datetime
对象表示日期时间。示例如下:
“`python
import datetime
# 自定义编码器
class BirthdayEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime(‘%Y-%m-%d %H:%M:%S’)
return super().default(obj)
# 序列化带日期对象的数据类型
user_info = {“name”: “Tom”, “age”: 18, “birthday”: datetime.datetime(1997, 12, 15)}
user_str = json.dumps(user_info, cls=BirthdayEncoder)
“`
这里我们自定义了BirthdayEncoder()
编码器,对日期类型进行串行化,并在使用json.dumps()
时指定使用该编码器。
示例说明
# 示例1:序列化包含自定义对象和日期的字典
import datetime
import json
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
class StudentEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Student):
return {"name": obj.name, "age": obj.age}
elif isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
else:
return super().default(obj)
student = Student("Tom", 18)
data = {"name": "学生信息", "student": student, "time": datetime.datetime.now()}
result = json.dumps(data, indent=2, ensure_ascii=False, cls=StudentEncoder)
print(result)
输出结果
{
"name": "学生信息",
"student": {
"name": "Tom",
"age": 18
},
"time": "2021-11-04 22:33:35"
}
# 示例2:序列化多层内嵌自定义和简单类型的列表
import json
class Info:
def __init__(self, name, age):
self.name = name
self.age = age
class InfoEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Info):
return {"name": obj.name, "age": obj.age}
else:
return super().default(obj)
data = [
{"name":"Tom","info":[Info("Tom1",11),Info("Tom2",12)]},
{"name":"Jerry","info":[Info("Jerry1",21),Info("Jerry2",22)]}
]
result = json.dumps(data,indent=2,ensure_ascii=False,cls=InfoEncoder)
print(result)
输出结果
[
{
"name": "Tom",
"info": [
{
"name": "Tom1",
"age": 11
},
{
"name": "Tom2",
"age": 12
}
]
},
{
"name": "Jerry",
"info": [
{
"name": "Jerry1",
"age": 21
},
{
"name": "Jerry2",
"age": 22
}
]
}
]
以上就是关于Python如何把不同类型数据的JSON序列化的完整攻略。