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

