在我使用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?
答案 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'}