嵌套列表转numpy数组后JSON序列化报错的解决方法求助
解决嵌套列表转JSON序列化的问题
问题根源
- 尝试1的错误原因:
pvTreatment是形状不均匀的嵌套列表(比如子列表长度不一致),无法直接转换为同构的float64类型numpy数组,因此触发ValueError。 - 尝试2的错误原因:用
object类型创建numpy数组后,列表中仍保留numpy原生的float32对象,而Flask的jsonify默认不支持序列化numpy数值类型,因此触发TypeError。
解决方案
直接递归遍历嵌套列表,将所有numpy原生数值类型转换为Python原生类型,跳过numpy数组中转步骤:
- 定义类型转换函数:
def convert_numpy_to_python(obj): if isinstance(obj, list): return [convert_numpy_to_python(item) for item in obj] elif isinstance(obj, np.generic): # 将numpy的float32/int64等类型转为Python原生数值 return obj.item() else: return obj
- 处理目标字段并构建结果字典:
resultsDict = { "extras": { "pvTreatment": convert_numpy_to_python(pvTreatment), # 其他需要处理的字段同理 } }
- 直接返回
jsonify(resultsDict)即可,此时所有元素都是Python原生可序列化类型,且保留了原嵌套列表的不均匀结构。
替代方案(可选)
如果需要保留numpy数组处理流程,可以先将嵌套列表转为object类型数组,再遍历转换每个元素的类型:
pv_array = np.array(pvTreatment, dtype=object) # 遍历数组转换所有numpy数值类型 pv_processed = [[float(item) if isinstance(item, np.float32) else item for item in sublist] for sublist in pv_array.tolist()] resultsDict = { "extras": { "pvTreatment": pv_processed, # 其他字段 } }
不过这种方式仅适用于固定层级的嵌套列表,递归函数的通用性更强。
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

