📌  相关文章
📜  异常值:User 类型的对象不是 JSON 可序列化的 - Python (1)

📅  最后修改于: 2023-12-03 14:54:10.957000             🧑  作者: Mango

异常值:User 类型的对象不是 JSON 可序列化的 - Python

在 Python 中,JSON 是一种常用的数据序列化格式。它被广泛用于数据存储和交换,尤其是在 Web 开发中。JSON 能够序列化基本数据类型、列表、字典等大多数 Python 数据类型,但对于自定义对象,可能会出现 "TypeError: Object of type User is not JSON serializable" 的异常。

这个异常通常是因为 Python 的 JSON 模块只能将一些基本数据类型和某些可迭代对象(例如列表和字典)序列化为 JSON 字符串。而自定义对象的序列化无法直接进行。下面是一些可能导致这个异常的原因:

  • 对象中包含大量自定义方法,JSON 反序列化时无法识别
  • 对象中包含 datetime、Decimal 等 Python 内置类型,JSON 反序列化时也无法处理
  • 对象中包含不能被 JSON 序列化的数据类型和对象(例如函数、对 self 的引用等)

为了解决这个异常,我们可以使用 JSON 编码器和解码器提供的自定义序列化和反序列化方式。在 Encoder 类中,我们可以自定义 JSON 编码器,以便将 User 对象序列化为 JSON 字符串。在 Decoder 类中,我们可以自定义 JSON 解码器,以便将 JSON 字符串反序列化为 User 对象。

下面是一个示例代码片段,其中包含 Encoder 和 Decoder 类。它们都继承了 JSONEncoder 和 JSONDecoder 类,并分别实现了自定义的 encode 和 decode 方法。在 encode 方法中,我们检查对象是否为 User 类型。如果是,则使用字典包装对象数据,并让 JSON 编码器使用字典数据进行编码。在 decode 方法中,我们检查 JSON 字符串是否包含 User 对象。如果是,则使用 User 类型创建新对象,并将 JSON 字符串中的数据赋值给对象的属性。

import json
from datetime import datetime

class User:
    def __init__(self, name, email, dob):
        self.name = name
        self.email = email
        self.dob = dob

class Encoder(json.JSONEncoder):
    def encode(self, obj):
        if isinstance(obj, User):
            return json.dumps({'name': obj.name, 'email': obj.email, 'dob': obj.dob.strftime('%Y-%m-%d')})
        return super().encode(obj)

class Decoder(json.JSONDecoder):
    def decode(self, s):
        data = json.loads(s)
        if 'name' in data and 'email' in data and 'dob' in data:
            return User(data['name'], data['email'], datetime.strptime(data['dob'], '%Y-%m-%d'))
        return data

# 使用示例
user = User('John Doe', 'john@example.com', datetime(2000, 1, 1))
user_json = json.dumps(user, cls=Encoder)
print(user_json) # {"name": "John Doe", "email": "john@example.com", "dob": "2000-01-01"}
user_obj = json.loads(user_json, cls=Decoder)
print(user_obj.name, user_obj.email, user_obj.dob) # John Doe john@example.com 2000-01-01 00:00:00

以上就是解决 "TypeError: Object of type User is not JSON serializable" 异常的一个方法。当然,此处仅提供了一个编码器和解码器的示例实现,实际情况还需要根据具体对象结构进行自定义序列化和反序列化的实现。