我正在尝试将json结果存储在GAE数据存储区中,以便我以后可以读取它。我将它转储到String,然后存储它,然后读取它并将其加载回dict。但是在加载后我再也不能把它看作dict了。
result = freebase.mqlready(query)
打印结果:
[{u'mid': u'/m/095hd',
u'name': u'Settlers of Catan',
u'type': u'/games/game'},
{u'mid': u'/m/025sm93',
u'name': u'The Game of Life',
u'type': u'/games/game'}]
for r in result:
name = r.name # works, I can get the name and other values.
json_dump = simplejson.dumps(result)
text = db.Text(json_dump)
fbresult = model.FB(text=text)
fbresult.put()
####
stored_text = fbresult.text
json = simplejson.loads(stored_text)
打印json:
[{u'mid': u'/m/095hd',
u'name': u'Settlers of Catan',
u'type': u'/games/game'},
{u'mid': u'/m/025sm93',
u'name': u'The Game of Life',
u'type': u'/games/game'}]
for j in json:
name = json.name
错误:
AttributeError: 'dict' object has no attribute 'name'
答案 0 :(得分:9)
呃,看起来你正在访问集合而不是内部对象:
当然你的意思是:
for j in json:
name = j['name']
答案 1 :(得分:2)
Ordinary dictionary不会将属性访问转换为项目查找:
>>> d = {'name': 'Joe'}
>>> d.name
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'name'
>>> d['name']
'Joe'
simplejson
默认返回普通词典。
您可以使用Storage
对象,类似于字典,但可以使用obj.foo
除了obj['foo']
。
>>> from storage import Storage
>>> s = Storage(d)
>>> s['name']
'Joe'
>>> s.name
'Joe'
您可以使用Storage
参数将所有json对象转换为object_hook
:
obj = simplejson.loads(stored_text, object_hook=Storage)
答案 2 :(得分:1)
似乎freebase.mqlready返回的result
不是真正的字典,而是通过__getitem__
委托给__getattr__
的子类(即:你可以r.name
而不是r['name']
)。
simplejson可以很好地转储它(它是一个dict子类)但是当它加载它时它返回一个普通的dict而不是委托属性访问项目访问。