我想使用 JSON 将字典传输到另一个 python 程序。在此之前,我想确保加载/转储过程之后的数据完全相同。因此,我启动了一个程序进行测试。
>>> import json
>>> original_dict = {0: {1: 2}}
>>> original_dict == json.loads((json.dumps(original_dict)))
False
我想我错过了一些加载/转储参数以使其工作。请指教。
提前致谢
根据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
它不起作用的原因是整数键被转换为字符串:
>>> 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
你错过了关于 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 可能不是要走的路。使用其他答案中的建议之一可能会更好。
如何使用pickle lib序列化对象并计算结果字符串MD5哈希?