万能的python序列化辅助函数
摘要:可以支持列表元组里面的类对象,支持字典中的类对象,支持类对象中的类对象,
支持各种库生成的对象,例如 ObjectId, UUID, MD5, datetime
等。
问题
问题: 普通情况下使用json
进行序列化的时候,遇到不同的类的对象就往往很难实现序列化,尤其是在各种数据结构进行嵌套的时候
那么就想到了通用的解决方式。
解决方式
每个类都定制化实现 __dict__
或者不实现也可以。
就可以使用下面的辅助函数来进行序列化:
# python 2
class Utils(object):
@classmethod
def remove_unserializable(cls, items):
serializable = (list, dict, tuple, str, unicode, int, long, float, True, False, None)
new_item = items
if isinstance(items, dict):
new_item = {}
for k, v in items.iteritems():
new_item[k] = cls.remove_unserializable(v)
if isinstance(items, (list, tuple)):
new_item = list()
for item in items:
new_item.append(cls.remove_unserializable(item))
if type(items) not in serializable:
try:
if hasattr(items, "__dict__"):
return cls.remove_unserializable(getattr(items, "__dict__"))
else:
return str(items)
except:
pass
return new_item
其中最主要的就是这一行代码了:
items = {} # 某个类的 字典属性返回值
if hasattr(items, "__dict__"):
return cls.remove_unserializable(getattr(items, "__dict__"))
这行代码可以把类的字典中嵌套的各种类型的的对象属性提取出来,以字典的形式出现
同时,上面的辅助函数支持解析列表,元组 这两种序列,对于简单的python类型则是直接返回
然后最后,功能强大的辅助函数就诞生了!
使用的时候可以像下面这样!
import json
json.dumps(whatever, default=Utils.remove_unserializable)
最后
总结一下支持:可以支持列表元组里面的类对象,支持字典中的类对象,支持类对象中的类对象,
支持各种库生成一些Id 例如 ObjectId, UUID, MD5
。
如果需要,可以根据具体环境,修改辅助函数,然后通用的json序列化函数就来了,再也不用只是用 __dict__
了