Simplejson转储和加载不返回有效的字典

时间:2011-01-03 07:06:27

标签: python json google-app-engine simplejson

我正在尝试将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'

3 个答案:

答案 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而不是委托属性访问项目访问。