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