You need to enable JavaScript to run this app. Flask向JS传递列表遇Undefined类型不可JSON序列化报错求助
优惠活动
大模型
产品
解决方案
定价
更多

Flask向JS传递列表遇Undefined类型不可JSON序列化报错求助

Flask传递列表到前端报 TypeError: Object of type 'Undefined' is not JSON serializable 排查与修复

核心报错来源

报错是在后端执行json.dumps阶段触发的,根本还没到前端渲染环节。你当前预判的“列表为Undefined状态”方向是对的——待序列化的列表元素中混入了Python标准json模块无法识别的Undefined类型值,不是前端JS层面的问题。

第一步:定位混入Undefined值的位置

  • 不要直接把LstSNV.serialize()塞进json.dumps执行,拆成独立步骤逐元素检查:
    # 临时调试代码
    serialized_lst = LstSNV.serialize()
    print(f"序列化对象类型: {type(serialized_lst)}")
    for idx, item in enumerate(serialized_lst):
        print(f"第{idx}个元素类型: {type(item)}, 值: {item}")
    
  • 重点排查自定义serialize()方法的逻辑:很多自研数据结构的serialize实现中,碰到缺失字段、取值失败的场景,会返回自定义的Undefined类实例,这类实例没有内置JSON序列化规则,直接触发报错。如果列表来自pandas/numpy的计算结果,缺失值、numpy非标准数值类型也会触发同类报错。

你当前代码的冗余冲突问题

你现在的写法重复执行了JSON序列化操作,本身就容易引发逻辑混乱:

  • 后端已经手动调用json.dumps()把Python对象转成了JSON格式字符串
  • 前端模板又给这个字符串套了Jinja2的|tojson|safe过滤器
    这个过滤器的原生作用是把传入的Python原始对象转成JS可识别的JSON值,对已经转成字符串的内容二次编码,会造成转义混乱。
    两个方案二选一,不要混用:
  1. 后端传原始Python对象,前端用tojson处理(官方推荐写法)
    # 后端代码:移除手动json.dumps
    serialized_lst = LstSNV.serialize()
    return render_template("spatial.html", AO_sDocument=occu, snvLst=serialized_lst)
    
    前端模板代码保持:let dataset = {{ snvLst|tojson|safe }};
  2. 后端手动转JSON字符串,前端直接解析
    # 后端代码:保留手动序列化,加兜底规则
    jsonString = json.dumps(LstSNV.serialize(), default=str)
    return render_template("spatial.html", AO_sDocument=occu, snvLst=jsonString)
    
    前端模板代码修改:let dataset = JSON.parse('{{ snvLst|safe }}');

Undefined值的通用修复逻辑

如果没法修改上游生成Undefined值的代码逻辑,直接给json序列化环节加自定义处理规则,碰到Undefined类型自动替换为合法值:

def json_serializer(obj):
    # 碰到自定义Undefined类型,直接转成None(JSON序列化后对应JS的null)
    if type(obj).__name__ == "Undefined":
        return None
    # 其他无法识别的类型统一转成字符串兜底
    return str(obj)

# 序列化时指定自定义规则
jsonString = json.dumps(LstSNV.serialize(), default=json_serializer)

无关测试说明

你写的按钮myFunction测试逻辑,是纯前端DOM取值的JS操作,和后端序列化报错没有关联,无法用来定位当前的问题。

内容的提问来源于stack exchange,提问作者Ellie Han

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 17:36:06