Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python jsonpickle将我的字典键从数字转换为字符串_Python - Fatal编程技术网

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

Python jsonpickle将我的字典键从数字转换为字符串,python,Python,我试图以一种可以在外部表单中读取对象并找到jsonpickle的方式序列化对象。但事实证明,它将我的字典键从整数转换为字符串 我注意到仅使用JSON包就出现了问题,但我希望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

我试图以一种可以在外部表单中读取对象并找到jsonpickle的方式序列化对象。但事实证明,它将我的字典键从整数转换为字符串

我注意到仅使用JSON包就出现了问题,但我希望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。因为我的对象是复杂的(循环引用),所以我无法摆脱一些无法处理的东西。我最初的要求是要有一种我可以在文本编辑器中阅读的格式,这样我就可以检测出逻辑问题,只要常规的纠错码是可靠的(它是可靠的),而不是现在这样做。有一天,我可能会想让其他一些非Python软件使用这个文件,所以我想找到一个可用的解决方案。XML格式?Python社区似乎对序列化为XML不感兴趣。至少我还没有找到一个像pickle/jsonpickle那样容易工作的包

这是因为JSON格式()要求对象中的所有键(python中的dict键)都是字符串

虽然不是基于文本的,但MessagePack允许整数映射键:

>>> import msgpack
>>> type(msgpack.unpackb(msgpack.packb({12: 23})).keys()[0])
<type 'int'>
导入msgpack >>>类型(msgpack.unpacb(msgpack.packb({12:23})).keys()[0])
您可以使用
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())

这是来自的JSON对象定义。所以基本上所有键都必须是字符串,所以在将对象转换为JSON对象时,int键将转换为字符串。没有别的了

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

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

在jsonpickle中,您可以使用'keys'参数来保存键,而无需将它们强制为字符串

要编码,请执行以下操作:

jsonpickle.encode(your_object, keys=True)
以及解码:

jsonpickle.decode(the_encoded_object, keys=True)

您的数据有多大?对于小的,您可以使用
repr
。(大一点的也行,只是印刷得不太好,所以可能很难阅读)这很有趣,我会研究一下,但我的物体太复杂了。它具有循环对象引用。