使用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
相关产品推荐
相关产品推荐

