我试图以一种可以在外部表单中读取它们的方式序列化我的对象,并找到了 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'}
>>>
Run Code Online (Sandbox Code Playgroud)
更新:短期内我的工作是拥有并行保存功能——一个用于 pickle,一个用于 jsonpickle。由于我的对象很复杂(循环引用),我无法摆脱无法处理的对象。我最初的要求是拥有一种可以在文本编辑器中读取的格式,这样我就可以检测逻辑问题,只要常规 pickel 是可靠的(它是),那么现在就可以了。有一天我可能想让其他一些非 Python 软件吃掉这个文件,所以我想找到一个可用的解决方案。XML 格式?Python 社区似乎对序列化为 XML 不太感兴趣。至少我还没有找到一个像 pickle/jsonpickle 一样容易工作的包。
在 jsonpickle 中,您可以使用 'keys' 参数来保存键,而不将它们强制为字符串。
要编码,请执行以下操作:
jsonpickle.encode(your_object, keys=True)
Run Code Online (Sandbox Code Playgroud)
并解码:
jsonpickle.decode(the_encoded_object, keys=True)
Run Code Online (Sandbox Code Playgroud)
这是因为 JSON 格式 ( http://json.org/ ) 要求对象中的所有键(python 中的字典键)都是字符串。
虽然不是基于文本,但 MessagePack 允许整数映射键:
>>> import msgpack
>>> type(msgpack.unpackb(msgpack.packb({12: 23})).keys()[0])
<type 'int'>
Run Code Online (Sandbox Code Playgroud)