jsonpickle将我的字典键从数字转换为字符串

时间:2015-05-21 14:06:54

标签: python

我试图以一种我可以在外部形式中读取它们并找到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一样容易的包。

4 个答案:

答案 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)

enter image description here

这是来自http://json.org的JSON对象定义。因此基本上所有键必须都是字符串,因此在将对象转换为JSON对象时,您的int键将转换为字符串。没别了。

如果您需要的只是字符串表示,则不必使用jsonpickle。

>>> a={}
>>> a[11]="eleventy"
>>> a[22]="twice that"
>>> str(a)
"{11: 'eleventy', 22: 'twice that'}"