如何解决TypeError: ndarray类型无法JSON序列化问题
解决JSON序列化ndarray报错的问题
嘿,这个问题我太熟了!JSON的序列化器只认Python原生的数据类型(比如列表、字典、字符串这些),而ndarray是NumPy的自定义对象,JSON根本不知道该怎么把它转成JSON格式,所以才会抛出TypeError: Object of type 'ndarray' is not JSON serializable这个错误。下面给你两种简单有效的解决办法:
方法一:直接把ndarray转换成Python列表
这是最直接的方案,在你把特征向量添加到knownEmbeddings列表的时候,就用NumPy的.tolist()方法把ndarray转成原生列表。修改你的代码如下:
import json import numpy as np knownEmbeddings = [] knownNames = [] for (i, imagePath) in enumerate(imagePaths): # 你的其他代码,比如提取特征得到vec knownNames.append(name) # 把ndarray转成Python列表再添加 knownEmbeddings.append(vec.flatten().tolist()) data = {"embeddings": knownEmbeddings, "names": knownNames} with open('file.json', "w") as f: # 这里用文本模式"w"就行,不用二进制"wb" json.dump(data, f, indent=4)
注意:我把原来的
open('file.json', "wb")改成了"w",因为json.dump输出的是字符串,用文本模式写入更合适,二进制模式反而可能出现编码问题。
方法二:自定义JSON编码器(适合大量ndarray数据的场景)
如果你的代码里有很多地方需要序列化NumPy对象,或者不想每次都手动转列表,可以写一个自定义的JSON编码器,让JSON自动处理ndarray:
import json import numpy as np class NumpyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.ndarray): return obj.tolist() # 还可以处理其他NumPy基本类型,比如np.float32、np.int64之类的 elif isinstance(obj, np.generic): return obj.item() return super().default(obj) # 然后在保存的时候指定cls参数 knownEmbeddings = [] knownNames = [] for (i, imagePath) in enumerate(imagePaths): # 你的其他代码 knownNames.append(name) knownEmbeddings.append(vec.flatten()) data = {"embeddings": knownEmbeddings, "names": knownNames} with open('file.json', "w") as f: json.dump(data, f, indent=4, cls=NumpyEncoder)
这个编码器会自动识别ndarray和其他NumPy基本类型,把它们转换成JSON能处理的原生类型,用起来更省心。
两种方法都能解决你的问题,选哪种看你的场景:如果只是偶尔转几个数组,方法一足够简单;如果经常要处理NumPy数据,方法二更高效。
内容的提问来源于stack exchange,提问作者S Andrew
相关产品推荐
相关产品推荐

