最简单的解决方案是使用json dumps和loads
from json import loads, dumps
from collections import OrderedDict
def to_dict(input_ordered_dict):
return loads(dumps(input_ordered_dict))
注意:上面的代码适用于已知为可序列化对象的字典。默认对象类型列表可以在这里找到。
因此,如果有序字典不包含特殊值,则应该足够了。
编辑:根据评论,让我们改进上面的代码。假设input_ordered_dict
可能包含默认情况下无法被json序列化的自定义类对象时,
在这种情况下,我们应该使用我们自己的自定义序列化器作为json.dumps
的default
参数。
(例如):
from collections import OrderedDict as odict
from json import loads, dumps
class Name(object):
def __init__(self, name):
name = name.split(" ", 1)
self.first_name = name[0]
self.last_name = name[-1]
a = odict()
a["thiru"] = Name("Mr Thiru")
a["wife"] = Name("Mrs Thiru")
a["type"] = "test"
def custom_serializer(obj):
if isinstance(obj, Name):
return obj.__dict__
b = dumps(a)
b = dumps(a, default=custom_serializer)
这个例子可以扩展到更大的范围。我们甚至可以添加过滤器或根据需要修改值。只需向 custom_serializer
函数添加一个 else 部分即可。
def custom_serializer(obj):
if isinstance(obj, Name):
return obj.__dict__
else:
return None
在使用自定义序列化器时,顶部给出的函数应该是:
from json import loads, dumps
from collections import OrderedDict
def custom_serializer(obj):
if isinstance(obj, Name):
return obj.__dict__
else:
return None
def to_dict(input_ordered_dict):
return loads(dumps(input_ordered_dict, default=custom_serializer))
OrderedDict
实例吗? - Patrick Collinsdict
可用的地方使用OrderedDict
。 - jonrsharpe