1. 为什么会出现int64无法JSON序列化的错误
第一次遇到这个错误时我也很懵,明明就是个普通的数字,怎么就不能转成JSON了呢?后来才发现问题出在数据类型上。Python自带的json模块只能处理基本数据类型,比如int、float、str这些。但当我们用NumPy这类科学计算库时,经常会遇到int64、float32这些特殊数值类型。
举个例子,你用NumPy创建了一个数组:
import numpy as np
arr = np.array([1, 2, 3], dtype=np.int64)
这时候arr里的数字都是int64类型,不是Python原生的int。当你尝试用json.dumps()序列化时就会报错:
import json
json.dumps(arr[0]) # 这里会抛出TypeError
这个错误的本质是json模块的编码器不认识int64这种类型。Python自带的json模块在设计时只考虑了最基础的数据类型,毕竟JSON标准本身也只定义了有限的几种数据类型。NumPy为了性能优化引入的特殊数值类型,就超出了这个范围。
2. JSON序列化的底层机制
要彻底理解这个问题,我们需要看看json模块是怎么工作的。当你调用json.dumps()时,背后其实发生了这些事情:
- 编码器会先检查对象是否是JSON原生支持的类型(dict, list, str, int, float, bool, None)
- 如果不是,就调用JSONEncoder的default()方法尝试转换
- default()方法默认实现是直接抛出TypeError
我们可以看看Python源码中的相关部分(简化版):
class JSONEncoder:
def default(s


249

被折叠的 条评论
为什么被折叠?



