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

使用json dumps序列化含list of tuples的dict失败,报错0不可序列化

问题根源与解决方法

这个问题我之前也碰到过,其实报错的根源不是数字0本身,而是它所在的元组(tuple)——JSON规范里根本没有元组这个类型,json模块默认只能序列化和JSON类型一一对应的Python结构:比如dict对应JSON对象、list对应JSON数组、str/int/float/bool/None对应JSON的字符串/数字/布尔值/空值,但tuple不在这个支持列表里。哪怕元组里是合法的JSON值(比如0),整个元组也没法被直接序列化,所以报错信息才会指向0,其实是个“误导”。

先看一个模拟你的场景的示例

import json

# 模拟包含元组列表的嵌套字典
nested_dict = {
    "multi_index_data": {
        "values": [(0, 100), (1, 200), (2, 300)]
    }
}

# 直接调用json.dumps会触发报错
try:
    json.dumps(nested_dict)
except TypeError as e:
    print(e)  # 输出:0 is not JSON serializable

两种可行的解决办法

方法1:手动将所有元组转为列表

如果你能提前控制数据生成过程,或者可以遍历修改原始数据结构,把所有tuple转换成list即可:

def convert_tuples_to_lists(obj):
    # 递归遍历,把所有元组转成列表
    if isinstance(obj, tuple):
        return list(obj)
    elif isinstance(obj, list):
        return [convert_tuples_to_lists(item) for item in obj]
    elif isinstance(obj, dict):
        return {key: convert_tuples_to_lists(value) for key, value in obj.items()}
    else:
        return obj

# 处理后再序列化
processed_data = convert_tuples_to_lists(nested_dict)
print(json.dumps(processed_data))
# 输出:{"multi_index_data": {"values": [[0, 100], [1, 200], [2, 300]]}}

方法2:自定义JSON编码器

如果不想修改原始数据结构,可以自定义一个编码器,让json模块知道如何处理元组:

import json

class TupleSupportEncoder(json.JSONEncoder):
    def default(self, obj):
        # 遇到元组就转为列表
        if isinstance(obj, tuple):
            return list(obj)
        # 其他类型交给默认逻辑处理
        return super().default(obj)

# 使用自定义编码器进行序列化
print(json.dumps(nested_dict, cls=TupleSupportEncoder))
# 输出:{"multi_index_data": {"values": [[0, 100], [1, 200], [2, 300]]}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:04:17