You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:31:11