使用json.dumps序列化Kafka数据报错:TypeError: Object of type module is not JSON serializable
解决ndarray复数信号JSON序列化报错问题
报错原因分析
你遇到的TypeError: Object of type module is not JSON serializable不是因为ndarray本身,而是你的signal字典中存在模块类型的变量——比如调用Send函数时,误将numpy模块(或其他模块)作为参数传入,而非实际的信号数组;或者time/frequency变量被错误赋值为模块对象。
排查步骤
先在Send函数开头添加类型检查,定位问题变量:
def Send(complex_signal, frequency, time): # 打印所有变量类型,找出模块对象 print("time类型:", type(time)) print("frequency类型:", type(frequency)) print("complex_signal类型:", type(complex_signal)) # 后续代码...
如果输出中有<class 'module'>,说明对应变量传参错误,修正后再处理数组序列化。
正确序列化复数ndarray的方案
复数在JSON中没有原生支持,需要将其转换为JSON可识别的结构(如字典或列表),以下是两种可行方案:
方案1:自定义JSON编码器(推荐)
实现一个编码器自动处理numpy数组和复数类型:
import json import numpy as np class NumpyComplexEncoder(json.JSONEncoder): def default(self, obj): # 处理ndarray:转成列表 if isinstance(obj, np.ndarray): return obj.tolist() # 处理复数:转成包含实部和虚部的字典 elif isinstance(obj, np.complex_): return {"real": float(obj.real), "imag": float(obj.imag)} # 其他类型按默认规则处理 return super().default(obj) def Send(complex_signal, frequency, time): # 先排除模块对象 if any(isinstance(v, type(np)) for v in [complex_signal, frequency, time]): raise ValueError("参数不能是模块对象,请检查传参") signal = { "time": time, "frequency": frequency, "complex_signal": complex_signal } # 使用自定义编码器序列化 msg = json.dumps(signal, cls=NumpyComplexEncoder) producer.produce('topic_test', key=None, value=msg)
方案2:手动转换数组
手动将复数数组转为包含实部、虚部的嵌套列表:
import json import numpy as np def Send(complex_signal, frequency, time): # 检查参数类型 if isinstance(complex_signal, type(np)): raise ValueError("complex_signal不能是numpy模块,请传入实际的信号数组") # 将每个复数转为[实部, 虚部]的列表 processed_signal = [[float(num.real), float(num.imag)] for num in complex_signal.flatten()] signal = { "time": time, "frequency": frequency, "complex_signal": processed_signal } msg = json.dumps(signal) producer.produce('topic_test', key=None, value=msg)
内容的提问来源于stack exchange,提问作者cpxi2
相关产品推荐
相关产品推荐

