Python2升级Python3后json.dumps提示0不可JSON序列化如何解决
问题原因
Python标准库的json模块仅支持序列化Python原生数据类型,无法识别Numpy定义的数值类型(如np.int32、np.float64等)。你日志中提到的0 is not JSON serializable里的0,本质是Numpy类型的标量值,并非Python原生int类型,所以触发了序列化报错。
解决方案
方案1:自定义json序列化编码器(通用且轻量)
新增一个Numpy类型转换函数,在调用json.dumps时通过default参数传入即可自动适配所有Numpy标量类型:
import json import numpy as np # 定义Numpy类型编码器 def numpy_encoder(obj): # 匹配所有Numpy标量类型,转为Python原生类型 if isinstance(obj, np.generic): return obj.item() # 其他类型走默认序列化逻辑 raise TypeError(f"Object of type {type(obj)} is not JSON serializable") # 调用dumps时指定编码器 rec = json.dumps(rec, default=numpy_encoder)
该方案可以同时兼容你代码中label字段的Numpy整数类型,以及parse_rec返回的各个列表中可能残留的Numpy数值类型。
方案2:单独转换label字段(临时快速修复)
如果确认只有label字段是Numpy类型,可以直接在赋值时转换为Python原生int:
# 把取出的Numpy类型值转成Python原生int label = int(out.loc[int(id_)]) rec = {'label': label}
方案3:使用Pandas内置的json序列化工具
如果你项目中已经引入了Pandas,可以直接用Pandas自带的序列化工具,天然支持Numpy类型:
import pandas as pd rec = pd.io.json.dumps(rec)
补充说明
你之前尝试的.decode('utf-8')是用于bytes类型转字符串的方法,本次报错是数据类型不兼容导致,和编码无关,因此该方法无效。
内容的提问来源于stack exchange,提问作者Hanna
相关产品推荐
相关产品推荐

