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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:29:52