我想使用JSON将字典传输到另一个python程序。在此之前,我想确保在加载/转储过程之后数据完全相同。因此我开始了一个测试程序。
>>> import json
>>> original_dict = {0: {1: 2}}
>>> original_dict == json.loads((json.dumps(original_dict)))
False
我认为我错过了一些加载/转储参数以使其工作。请指教。
提前致谢
答案 0 :(得分: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
这意味着对象的键必须是字符串。在你的情况下,你最好使用pickle:
>>> import pickle
>>> original_dict = {0: {1: 2}}
>>> original_dict == pickle.loads((pickle.dumps(original_dict)))
True
答案 1 :(得分: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
答案 2 :(得分: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可能就不行了。你可能会对其他答案中的一个建议感觉更好。
答案 3 :(得分:0)
如何使用pickle lib序列化对象并计算结果字符串MD5 hash?