MST

星途 面试题库

面试题:Python字典序列化与反序列化中的数据类型处理

在Python中,使用JSON模块进行字典的序列化与反序列化时,JSON不支持Python中的set类型。如果字典中存在set类型的数据,例如 {'data': {1, 2, 3}},如何进行处理,使得该字典能够成功序列化和反序列化,且反序列化后的数据尽可能还原原始结构?请给出代码实现并解释思路。
36.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 在序列化时,将 set 类型的数据转换为可序列化的类型,比如 list
  2. 在反序列化后,将转换后的 list 再转换回 set,以尽可能还原原始结构。

代码实现

import json


# 自定义JSON编码器,处理set类型
class SetEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, set):
            return list(o)
        return super().default(o)


# 自定义JSON解码器,将list转换回set
def set_decoder(dct):
    for key, value in dct.items():
        if isinstance(value, list):
            dct[key] = set(value)
    return dct


original_dict = {'data': {1, 2, 3}}
# 序列化
serialized = json.dumps(original_dict, cls=SetEncoder)
print("序列化后:", serialized)

# 反序列化
deserialized = json.loads(serialized, object_hook=set_decoder)
print("反序列化后:", deserialized)

代码解释

  1. 自定义JSON编码器 SetEncoder:继承自 json.JSONEncoder,重写 default 方法。当遇到 set 类型的数据时,将其转换为 list,其他类型的数据则使用默认的编码方式。
  2. 自定义JSON解码器 set_decoder:作为 json.loadsobject_hook 参数传入。在反序列化过程中,对字典的每个值进行检查,如果是 list,则将其转换回 set
  3. 序列化与反序列化操作:首先使用自定义编码器对原始字典进行序列化,然后使用自定义解码器对序列化后的字符串进行反序列化,从而实现包含 set 类型数据的字典的序列化与反序列化,并尽量还原原始结构。