Python:如何确保使用JSON转储/加载来验证数据

时间:2013-09-03 02:15:28

标签: python json

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

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

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

提前致谢

4 个答案:

答案 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?