Python:' unicode'对象没有属性' iteritems'

时间:2015-06-05 09:02:09

标签: python json

在我使用Python 2.6.9的应用程序中,我将此传入的JSON作为unicode字符串:

{"devices": "{1540702298: u\"{'on': u'True', 'group': '2', 'time': u'2015-06-04 16:37:52', 'value': u'74.1', 'lastChange': u'2015-06-05 09:28:10'}\"}"}

我尝试过以各种方式解析它但我仍然得到同样的错误......

例如:

a = unicode({"devices": "{1540702298: u\"{'on': u'True', 'group': '2', 'energyAccumBaseTime': u'2015-06-04 16:37:52', 'sensorValueRaw': u'74.1', 'lastChange': u'2015-06-05 09:28:10', 'energyAccumTotal': u'1.3', 'sensorValueUi': u'74.1'}\"}"})

b = json.loads(a)

print b['devices'] # all good I get the contents...

但是当我这样做的时候......

for k, v in b['devices'].iteritems():

print k

我收到错误:

  

'的unicode'对象没有属性' iteritems'

如何完整解析传入的JSON?

1 个答案:

答案 0 :(得分:10)

外部对象可能是JSON,但它包含一个字符串,该字符串本身是一个Python字典文字,包含Unicode文字作为值。

有人这样做了:

python_dictionary = {}
python_dictionary[integer_key] = str(another_dictionary)
outer_object {"devices": str(python_dictionary)}
在将outer_object编码为JSON之前

。该字典中的每个值本身就是表示Python字典的另一个字符串,这些字典包含更多代表字典的字符串,就像许多Matryoshka dolls一样。

您可以使用ast.literal_eval() function将其转换回Python对象:

import ast
import json

yourobject = json.loads(jsondata)
dictionary = ast.literal_eval(yourobject['devices'])
for key, nested in dictionary.iteritems():
    nested = ast.literal_eval(nested)
    print key, nested

但你应该真正修复产生字符串的任何东西,以避免将嵌套字典存储为字符串。请注意,嵌套字典中的键是整数;那些必须转换为字符串才能在JSON中工作。

演示:

>>> import json
>>> import ast
>>> jsondata = r'''{"devices": "{1540702298: u\"{'on': u'True', 'group': '2', 'time': u'2015-06-04 16:37:52', 'value': u'74.1', 'lastChange': u'2015-06-05 09:28:10'}\"}"}'''
>>> yourobject = json.loads(jsondata)
>>> type(yourobject['devices'])
<type 'unicode'>
>>> ast.literal_eval(yourobject['devices'])
{1540702298: u"{'on': u'True', 'group': '2', 'time': u'2015-06-04 16:37:52', 'value': u'74.1', 'lastChange': u'2015-06-05 09:28:10'}"}
>>> dictionary = ast.literal_eval(yourobject['devices'])
>>> dictionary[1540702298]
u"{'on': u'True', 'group': '2', 'time': u'2015-06-04 16:37:52', 'value': u'74.1', 'lastChange': u'2015-06-05 09:28:10'}"
>>> type(dictionary[1540702298])
<type 'unicode'>

>>> for key, nested in dictionary.iteritems():
...     nested = ast.literal_eval(nested)
...     print key, nested
... 
1540702298 {'on': u'True', 'lastChange': u'2015-06-05 09:28:10', 'group': '2', 'value': u'74.1', 'time': u'2015-06-04 16:37:52'}