我试图以一种我可以在外部形式中读取它们并找到jsonpickle的方式来序列化我的对象。但事实证明它将我的字典键从整数转换为字符串。
我只使用JSON包注意到问题this thread,但我希望jsonpickle可以解决问题。有没有已知的解决方法?或者,是否有更好的文本模式序列化格式用于Python?
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
>>> a={}
>>> a[11]="eleventy"
>>> a[22]="twice that"
>>> a
{11: 'eleventy', 22: 'twice that'}
>>> import jsonpickle
>>> jstring=jsonpickle.encode(a)
>>> jstring
'{"22": "twice that", "11": "eleventy"}'
>>> b=jsonpickle.decode(jstring)
>>> b
{'22': 'twice that', '11': 'eleventy'}
>>>
更新: 从短期来看,我的工作就是拥有并行保存功能 - 一个用于pickle,另一个用于jsonpickle。由于我的对象很复杂(循环引用),我无法摆脱无法处理的问题。我最初的要求是要有一个我可以在文本编辑器中读取的格式,这样我就可以检测出逻辑上的问题,只要常规的pickel是可靠的(它)就可以了。有一天,我可能想让其他非Python软件吃这个文件,所以我想找到一个有用的解决方案。 XML格式? Python社区似乎对序列化为XML感兴趣。至少我还没有发现一个像pickle / jsonpickle一样容易的包。
答案 0 :(得分:2)
在jsonpickle中,您可以使用'keys'参数保存密钥,而不必将其强制为字符串。
要进行编码,请执行以下操作:
jsonpickle.encode(your_object, keys=True)
并进行解码:
jsonpickle.decode(the_encoded_object, keys=True)
答案 1 :(得分:1)
这是因为JSON格式(http://json.org/)要求对象中的所有键(python中的dict键)都是字符串。
虽然不是基于文本的,但MessagePack允许整数映射键:
>>> import msgpack
>>> type(msgpack.unpackb(msgpack.packb({12: 23})).keys()[0])
<type 'int'>
答案 2 :(得分:1)
您可以将repr
用于小事或一般pprint
:
>>> a = {i: i for i in range(20)}
>>> import pprint
>>> pprint.pprint(a)
{0: 0,
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
6: 6,
7: 7,
8: 8,
9: 9,
10: 10,
11: 11,
12: 12,
13: 13,
14: 14,
15: 15,
16: 16,
17: 17,
18: 18,
19: 19}
您还可以将pprint
一个流写入:
with open('mydata.txt', 'w') as f:
pprint.pprint(a, f)
你可以这样读回来:
import ast
with open('mydata.txt') as f:
b = ast.literal_eval(f.read())
答案 3 :(得分:1)
这是来自http://json.org的JSON对象定义。因此基本上所有键必须都是字符串,因此在将对象转换为JSON对象时,您的int键将转换为字符串。没别了。
如果您需要的只是字符串表示,则不必使用jsonpickle。
>>> a={}
>>> a[11]="eleventy"
>>> a[22]="twice that"
>>> str(a)
"{11: 'eleventy', 22: 'twice that'}"