2

後で読むことができるように、jsonの結果をGAEデータストアに保存しようとしています。私はそれを文字列にダンプし、それを保存し、それを読み取って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'
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.fooobj['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

freebase.mqlreadyによってresult返されるのは、実際のdictではなく、__getitem__viaに委任するサブクラスのようです(つまり、の代わりに__getattr__実行できます)。simplejsonはそれをうまくダンプできますが(これはdictサブクラスです)、それをロードして戻すと、代わりに属性アクセスをアイテムアクセスに委任しないプレーンなdictを返します。r.namer['name']

于 2011-01-03T07:20:33.147 に答える