namedtuple对象json序列化之后的恢复


使用python的命名元组(collections.namedtunple),可以快速将数组转换为对 象,例如:

>>> import collections
>>> Point = collections.namedtuple('Point', ['x', 'y', 'z'])
>>> p1 = Point(x=3, y=2, z=4)
>>> p1
Point(x=3, y=2, z=4)

但是namedtunple在经过json序列化/反序列化之后,就变成字典了。

>>> import json
>>> s = json.dumps(p1._asdict()) 
>>> s
'{"x": 3, "y": 2, "z": 4}'
>>> p2 = json.loads(s)
>>> p2
{u'y': 2, u'x': 3, u'z': 4}

如果使用simplejson,可以直接调用simplejson.dumps(p1),simplejson默认会 将namedtuple作为字典处理(namedtuple_as_object=True)。最终,无论使用 json还是simplejson,都无法改变namedtuple变成字典的命运。要想由字典变 回namedtuple,只要使用字典作为关键词参数(kwargs)重新生成一个对象就可以 了。

>>> p3 = Point(**p2)
>>> p3
Point(x=3, y=2, z=4)