TypeError(f"Object of type {type(o).__name__} is not JSON serializable")
时间: 2025-03-28 15:15:38 浏览: 53
### 解决 Python 中对象不可 JSON 序列化的 TypeError 问题
当尝试将某些自定义类的对象转换为 JSON 字符串时,可能会遇到 `TypeError` 错误提示 “Object of type X is not JSON serializable”。这是因为默认情况下,Python 的标准库函数 `json.dumps()` 只能处理基本数据类型(如字典、列表、字符串等),而无法自动序列化复杂的数据结构或自定义对象。
为了克服这一限制,可以采用以下方法:
#### 方法一:通过 `default` 参数指定序列化逻辑
可以通过传递一个自定义的 `default` 函数给 `json.dumps()` 来实现对特定类型的序列化支持。该函数会接收无法被正常序列化的对象作为输入,并返回其可序列化的形式[^1]。
```python
import json
from datetime import date
class CustomClass:
def __init__(self, name, value):
self.name = name
self.value = value
def custom_serializer(obj):
if isinstance(obj, CustomClass):
return {"name": obj.name, "value": obj.value}
elif isinstance(obj, date): # 处理日期时间对象
return obj.isoformat()
raise TypeError(f"Type {type(obj)} not serializable")
custom_obj = CustomClass(name="Example", value=42)
serialized_data = json.dumps(custom_obj, default=custom_serializer)
print(serialized_data) # 输出: {"name": "Example", "value": 42}
```
#### 方法二:重写类中的 `__dict__` 属性
如果目标是简单地将对象属性转为键值对,则可以直接利用对象的内置 `__dict__` 属性来完成序列化操作。这种方式适用于那些不需要额外定制行为的情况。
```python
import json
class SimpleClass:
def __init__(self, a, b):
self.a = a
self.b = b
obj = SimpleClass(a=10, b=20)
serialized_data = json.dumps(obj.__dict__)
print(serialized_data) # 输出: {"a": 10, "b": 20}
```
#### 方法三:创建子类扩展 `JSONEncoder`
另一种更灵活的方式是继承并覆盖 `json.JSONEncoder.default()` 方法,在其中定义如何处理特殊类型实例的具体规则。
```python
import json
from datetime import datetime
class EnhancedJSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, (date, datetime)):
return o.isoformat()
try:
iterable = iter(o)
except TypeError:
pass
else:
return list(iterable)
return super().default(o)
data_with_datetime = {
'timestamp': datetime.now(),
'numbers': range(5),
}
encoded_json = json.dumps(data_with_datetime, cls=EnhancedJSONEncoder)
print(encoded_json)
# 输出类似于: {"timestamp": "2023-...", "numbers": [0, 1, 2, 3, 4]}
```
以上三种方式都可以有效解决 Python 对象不可 JSON 序列化的问题,具体选择取决于实际需求以及项目的复杂程度。
阅读全文
相关推荐



















