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

Python JSON序列化中如何自定义处理元组?

自定义Python JSON序列化中的元组处理

默认情况下,Python的json库会把元组直接序列化为列表,重写JSONEncoder的default方法无法改变这个行为——因为元组是库已知的可序列化类型,不会触发default回调。要实现自定义元组处理,你可以重写JSONEncoder的_iterencode方法,这是库内部用于递归生成序列化内容的核心方法,能拦截到元组的处理流程。

示例代码

比如我们想把元组序列化为带特殊标识的JSON对象(方便后续反序列化识别),可以这么写:

import json

class TupleEncoder(json.JSONEncoder):
    def _iterencode(self, obj, markers=None):
        if isinstance(obj, tuple):
            # 自定义元组序列化逻辑:包装为带__tuple__标记的对象
            yield '{"__tuple__": '
            yield from super()._iterencode(list(obj), markers)
            yield '}'
        else:
            # 其他类型沿用父类的序列化逻辑
            yield from super()._iterencode(obj, markers)

# 测试嵌套元组的序列化
test_data = {"name": "demo", "values": (1, 2, (3, "abc"))}
print(json.dumps(test_data, cls=TupleEncoder))

输出结果:

{"name": "demo", "values": {"__tuple__": [1, 2, {"__tuple__": [3, "abc"]}]}}

如果只是想改变元组的序列化格式(比如序列化为带括号的字符串),可以修改_iterencode里的逻辑:

class TupleEncoder(json.JSONEncoder):
    def _iterencode(self, obj, markers=None):
        if isinstance(obj, tuple):
            yield '"('
            first_item = True
            for item in obj:
                if not first_item:
                    yield ','
                first_item = False
                yield from self._iterencode(item, markers)
            yield ')"'
        else:
            yield from super()._iterencode(obj, markers)

原理说明

_iterencode是JSONEncoder内部负责递归遍历对象、生成序列化字符流的方法。当遇到元组时,默认逻辑会把它当作列表处理;重写这个方法后,我们可以优先拦截元组类型,替换为自定义的序列化逻辑,其他类型则交给父类处理,无需手动遍历整个数据结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:38:28