2

我想使用 JSON 将字典传输到另一个 python 程序。在此之前,我想确保加载/转储过程之后的数据完全相同。因此,我启动了一个程序进行测试。

>>> import json
>>> original_dict = {0: {1: 2}}
>>> original_dict == json.loads((json.dumps(original_dict)))
False

我想我错过了一些加载/转储参数以使其工作。请指教。

提前致谢

4

4 回答 4

3

根据RFC4627

An object structure is represented as a pair of curly brackets
surrounding zero or more name/value pairs (or members).  A name is a
string.  A single colon comes after each name, separating the name
from the value.  A single comma separates a value from a following
name.  The names within an object SHOULD be unique.

   object = begin-object [ member *( value-separator member ) ]
   end-object

   member = string name-separator value

这意味着对象的键必须是字符串。在您的情况下,您最好改用泡菜:

>>> import pickle
>>> original_dict = {0: {1: 2}}
>>> original_dict == pickle.loads((pickle.dumps(original_dict)))
True
于 2013-09-03T02:30:21.597 回答
1

它不起作用的原因是整数键被转换为字符串:

>>> print original_dict
{0: {1: 2}}
>>> print json.dumps(original_dict)
{"0": {"1": 2}}

我建议您使用shelve

import shelve

original_dict = {0: {1: 2}}
with shelve.open('test.db') as db: 
    db['mydict'] = original_dict   # store the dict

现在测试一切正常:

original_dict = {0: {1: 2}}
with shelve.open('test.db') as db: 
    retrieved_dict = d['mydict']   
print retrieved_dict == original_dict   # True
于 2013-09-03T02:26:05.240 回答
1

你错过了关于 JSON 本身的微妙之处。对象中的所有键都是字符串。因此,当您将原始文件转换dict为 json 时,它看起来像:

>>> json.dumps(original_dict)
'{"0": {"1": 2}}'

然后当你重新加载它时,

>>> json.loads(json.dumps(original_dict))
{u'0': {u'1': 2}}

并且您可以看到键仍然是字符串(或更准确地说,是unicode)。如果您最初使用

>>> original_dict = {'0': {'1': 2}}
>>> json.loads(json.dumps(original_dict)) == original_dict
True

你会看到你所期望的。

也就是说,如果您需要准确地保留一些任意数据,json 可能不是要走的路。使用其他答案中的建议之一可能会更好。

于 2013-09-03T02:28:52.940 回答
0

如何使用pickle lib序列化对象并计算结果字符串MD5哈希?

于 2013-09-03T02:21:17.747 回答