2011-01-03 8 views
2

Ich versuche, ein JSON-Ergebnis in den GAE-Datenspeicher zu speichern, so dass ich es später lesen kann. Ich deponiere es in einen String, dann speichere ich es, lese es dann und lade es zurück in ein Diktat. Aber ich kann es nicht mehr als ein Diktat nach dem Laden lesen.Simplejson Dump und Laden nicht gültig Wörterbuch

result = freebase.mqlready(query) 

drucken Ergebnis:

[{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) 

Drucken 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 

ERROR:

AttributeError: 'dict' object has no attribute 'name' 
+1

Ihre Variablennamen 'json' Auseinandersetzungen mit dem Modulnamen' json' – ismail

Antwort

9

Uh, sieht aus wie Sie die Sammlung anstatt das innere Objekt zugreifst:

Sicher haben Sie gemeint:

for j in json: 
    name = j['name'] 
1

Es scheint, dass die result zurückgegeben von freebase.mqready ist kein echtes dict, sondern eine Unterklasse, die an __getitem__ über __getattr__ delegiert (dh: Sie ca n tun r.name anstelle von r['name']). simplejson kann es einfach gut ausgeben (es ist eine dict-Unterklasse), aber wenn es wieder geladen wird, gibt es stattdessen ein einfaches dict zurück, das den Attributzugriff nicht an den Elementzugriff delegiert.

>>> 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 kehrt gewöhnlichen Wörter Standard:

2

Ordinary dictionary nicht Attribut Zugriff in Artikel Lookup verwandeln.

könnten Sie Storage Objekt verwenden, das wie ein Wörterbuch mit Ausnahme obj.foo ist, kann neben obj['foo'] verwendet werden.

>>> from storage import Storage 
>>> s = Storage(d) 
>>> s['name'] 
'Joe' 
>>> s.name 
'Joe' 

Sie könnten konvertieren alle json-Objekte Storage mit object_hook Parameter:

obj = simplejson.loads(stored_text, object_hook=Storage)