Python如何把不同类型数据的json序列化

  • Post category:Python

针对该问题,我准备讲解“Python如何把不同类型数据的JSON序列化”的完整攻略。

什么是JSON序列化

JSON序列化是将数据从Python对象转化为JSON格式的过程。在Python中,我们可以使用json模块来进行JSON序列化,该模块提供了dump(), dumps(), load(), 和loads()这四个方法来完成序列化和反序列化。

如何把不同类型数据的JSON序列化

下面,我们就来 整理一下如何把不同类型数据的JSON序列化的攻略,主要分为以下几个步骤:

  1. 下载和导入json模块

首先,我们需要下载和导入json模块,Python内置该模块,因此不需要进行额外安装。

python
import json

  1. 序列化简单数据类型

序列化简单数据类型,包括字符串、数字、列表、元组和布尔值等,可以直接调用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)
“`

  1. 序列化自定义数据类型

序列化自定义数据类型,需要使用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,进行序列化。

  1. 序列化带日期对象的数据类型

当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序列化的完整攻略。