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值,对已经转成字符串的内容二次编码,会造成转义混乱。
两个方案二选一,不要混用:
- 后端传原始Python对象,前端用tojson处理(官方推荐写法)
前端模板代码保持:# 后端代码:移除手动json.dumps serialized_lst = LstSNV.serialize() return render_template("spatial.html", AO_sDocument=occu, snvLst=serialized_lst)let dataset = {{ snvLst|tojson|safe }}; - 后端手动转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
相关产品推荐
相关产品推荐

