Pandas/Polars写入JSON列表到数据库遇ndarray无法序列化问题
解决ndarray无法JSON序列化的问题
报错的核心原因是你合并后的JSON数组列中存在numpy.ndarray类型对象,而JSON标准序列化不支持这种非原生Python类型。解决的关键是把所有ndarray转换为Python原生的list类型,以下分两种工具给出具体处理方案:
Pandas 处理方案
1. 合并列时直接转换
如果是通过apply合并多列生成JSON数组,在生成过程中就把ndarray转成list:
import numpy as np import pandas as pd # 假设你的DataFrame有col1、col2两个JSON列,其中可能包含ndarray df['json_array'] = df.apply( lambda row: [ val.tolist() if isinstance(val, np.ndarray) else val for val in [row['col1'], row['col2']] ], axis=1 )
2. 批量转换已存在的数组列
如果已经生成了包含ndarray的数组列,用递归函数批量转换所有嵌套的ndarray:
def normalize_ndarray(obj): if isinstance(obj, np.ndarray): return obj.tolist() elif isinstance(obj, dict): return {k: normalize_ndarray(v) for k, v in obj.items()} elif isinstance(obj, list): return [normalize_ndarray(item) for item in obj] return obj # 转换目标列 df['json_array'] = df['json_array'].apply(normalize_ndarray)
3. 写入数据库时指定JSON类型
转换完成后,写入时明确指定列的JSON类型,确保SQLAlchemy正确处理:
from sqlalchemy import create_engine, types engine = create_engine('你的数据库连接字符串') df.to_sql( 'testing', engine, if_exists='replace', dtype={'json_array': types.JSON} )
Polars 处理方案
1. 转换数组列中的ndarray
使用map_elements对数组列进行元素级转换:
import polars as pl import numpy as np def normalize_ndarray(obj): if isinstance(obj, np.ndarray): return obj.tolist() elif isinstance(obj, dict): return {k: normalize_ndarray(v) for k, v in obj.items()} elif isinstance(obj, list): return [normalize_ndarray(item) for item in obj] return obj # 转换目标列 df = df.with_columns( pl.col('json_array').map_elements(normalize_ndarray, return_dtype=pl.Object) )
2. 写入数据库
转换完成后直接写入即可:
df.write_database( table_name='testing', connection='你的数据库连接字符串', if_exists='replace' )
额外注意事项
- 如果你的JSON列是从数据库读取后解析产生的ndarray,建议在读取阶段就转换为list(比如Pandas的
read_sql时指定dtype或后续处理),避免后续合并时重复处理。 - 确保所有嵌套层级的ndarray都被转换,比如数组里的字典值是ndarray的情况,必须用递归函数处理。
内容的提问来源于stack exchange,提问作者SysRIP
相关产品推荐
相关产品推荐

