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

Apache Superset点击首页New+按钮添加图表报错:函数类型无法JSON序列化

解决Apache Superset 0.38.0点击首页New+创建图表时报JSON序列化错误的问题

从你的报错堆栈和环境信息来看,这是典型的JSON序列化无法处理函数对象的问题:在/chart/add页面生成bootstrap数据时,payload里混入了function类型的对象,而Python默认JSON编码器不支持序列化函数类型。结合你使用的Superset 0.38.0(一个较老旧的版本),下面给你几个针对性的解决思路:

一、先排查自定义配置或第三方扩展

  1. 检查你的superset_config.py配置文件,重点看是否设置了CUSTOM_JINJA_CONTEXT_ADDONS或其他自定义上下文变量,如果里面添加了Python函数,这些函数会被带入页面渲染的payload中,直接导致序列化失败。
    • 解决方式:把这些函数替换成字符串、字典等可序列化的对象,或者移除不必要的自定义函数配置。
  2. 确认是否安装了第三方Superset插件/扩展,部分老旧插件可能和0.38.0版本不兼容,在生成页面数据时意外注入了函数对象。
    • 解决方式:暂时禁用最近安装的插件,重启Superset后测试是否恢复正常。

二、修改Superset源码修复序列化问题

如果是Superset自身的版本bug(0.38.0确实存在一些已知的序列化漏洞),可以直接修改对应的视图代码:

  1. 找到Superset安装目录下的superset/views/chart/views.py文件(你的路径是/usr/local/lib/python3.6/site-packages/superset/views/chart/views.py)
  2. 在文件顶部导入函数类型判断工具:
    from types import FunctionType
    
  3. 在add方法中添加一个清理payload的辅助函数,过滤掉其中的函数对象:
    def clean_payload(obj):
        if isinstance(obj, dict):
            return {k: clean_payload(v) for k, v in obj.items() if not isinstance(v, FunctionType)}
        elif isinstance(obj, list):
            return [clean_payload(item) for item in obj if not isinstance(item, FunctionType)]
        else:
            return obj
    
  4. 把原来的json.dumps(payload)修改为:
    bootstrap_data=json.dumps(clean_payload(payload))
    
  5. 保存文件后,重启Superset服务,再尝试创建图表。

三、升级Superset版本(长期推荐)

Superset 0.38.0是2020年的旧版本,后续的1.x、2.x版本修复了大量这类底层序列化问题,同时带来了更多功能和稳定性提升。如果你的业务场景允许,建议升级到最新的稳定版本:

  • 升级前务必做好元数据库(如PostgreSQL/MySQL)的备份
  • 参考官方升级文档处理版本间的兼容性问题(比如执行数据库迁移脚本)

内容的提问来源于stack exchange,提问作者Rijo Joseph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:53:14