深入解析TypeError: Object of type int64 is not JSON serializable的根源与实战解决方案

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()时,背后其实发生了这些事情:

  1. 编码器会先检查对象是否是JSON原生支持的类型(dict, list, str, int, float, bool, None)
  2. 如果不是,就调用JSONEncoder的default()方法尝试转换
  3. default()方法默认实现是直接抛出TypeError

我们可以看看Python源码中的相关部分(简化版):

class JSONEncoder:
    def default(s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值