2

我正在尝试将 json 结果存储在 GAE 数据存储中,以便稍后阅读。我将它转储到一个字符串,然后存储它,然后读取它并将其加载回字典。但是加载后我不能再将其作为字典阅读。

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'
4

3 回答 3

9

呃,看起来你正在访问集合而不是内部对象:

你的意思肯定是:

for j in json:
    name = j['name']
于 2011-01-03T07:16:51.883 回答
2

普通字典不会将属性访问转换为项目查找:

>>> 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'

您可以将所有 json-objects 转换为Storageusingobject_hook参数:

obj = simplejson.loads(stored_text, object_hook=Storage)
于 2011-01-03T07:54:22.260 回答
1

似乎resultfreebase.mqlready 返回的不是真正的字典,而是委托给__getitem__via的子类__getattr__(即:您可以r.name代替r['name'])。simplejson 可以很好地转储它(它是一个 dict 子类),但是当它重新加载它时,它会返回一个普通的 dict 而不是将属性访问委托给项目访问。

于 2011-01-03T07:20:33.147 回答