【发布时间】:2017-06-12 19:15:06
【问题描述】:
我正在使用 python 序列化一个 python 对象以将其存储在我的缓存中。对于这个序列化,我使用json.dumps() 并在将其从缓存中取出后对其进行反序列化,我使用json.loads()。我认为这次往返不会有任何麻烦。但正如您在下面看到的那样,它失败了。
>>> import json
>>> from collections import namedtuple
>>> x = {"hello": 1, "goodbye": 2}
>>> y = namedtuple('Struct', x.keys())(*x.values())
>>> y
Struct(goodbye=2, hello=1)
>>> json.loads(json.dumps(y))
[2, 1] # <= I expected this to be the same value as y above!!
为什么这个 json.dumps/loads 往返有损?我可以使用什么函数将此对象序列化为反序列化将保留其原始值?我尝试使用pickle,但无法序列化对象。
【问题讨论】:
-
json 不知道命名元组。
-
JSON 并不意味着处理任意用户定义的对象类型。 JSON 支持对应于 Python
dict的“json 对象”和对应于 Pythonlist的“JSON 数组”。显然,pythonjson模块假定如果您将其传递给tuple,它将被序列化为 JSON 数组。但这将始终被反序列化为 Python 列表。您可以使用pickle序列化namedtuple返回的类型,但您必须保留该类型。您创建类型、实例化类型并一举丢弃类型:namedtuple('Struct', x.keys())(*x.values()). -
@juanpa.arrivillaga 为什么不从这么长的评论中做出回答?
-
@Jean-FrançoisFabre 所以,我很确定这是某个地方的副本,我一直在寻找它,但仍然没有找到。我可能记错了。我认为你的答案很好,我会取消删除它。
-
@juanpa.arrivillaga 我找到了一个类似的问答,但它不是重复的,因为它没有解释字段名称丢失的原因。
标签: python json serialization