gpt4 book ai didi

python - 为什么 python 的 json.loads/dumps 往返有损?

转载 作者:行者123 更新时间:2023-11-30 22:35:36 25 4
gpt4 key购买 nike

我正在使用 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 尝试根据对象的类型序列化对象。它不能序列化任何对象,只能序列化“基本”对象,例如 tuple (转换为方括号,如 list)、dict >list ...(当然还有整数、字符串、 float )。

使用 isinstance 测试对象时,它在 tuple 上成功,因为 namedtuple 被设计为从 tuple 继承:

y = namedtuple('Struct', x.keys())(*x.values())
print(isinstance(y,tuple))

结果为True

因此,在 json 模块的 encoder.py 文件中,您的数据与 iterencode 中的 isinstance 测试相匹配> 方法(下面的代码摘录,在我的 Python 3.4 版本的第 311 行左右):

   if isinstance(value, (list, tuple)):
chunks = _iterencode_list(value, _current_indent_level)

因此,任何继承自 listtuple 的类型都会像 list 一样被序列化

此处提出了解决方法:Serializing a Python namedtuple to json

关于python - 为什么 python 的 json.loads/dumps 往返有损?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44507113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com