2009-08-19 2 views
1

Ich habe ein großes hierarchisches Dataset im App Engine-Datenspeicher. Die Hierarchie wird durch die Speicherung der Daten in Entity-Gruppen erhalten, so dass ich einfach zu wissen, die obersten Element Schlüssel wie so einen ganzen Baum ziehen kann:Hierarchische Datenausgabe vom App Engine-Datenspeicher an JSON?

query = db.Query().ancestor(db.get(key))

Die Frage: Wie kann ich Ausgabe jetzt diese Daten als JSON und die Hierarchie beibehalten?

Google hat eine Dienstprogrammklasse namens GqlEncoder, die Unterstützung für Datenspeicherabfrageergebnisse zu simplejson hinzufügt, aber im Grunde flacht es die Daten ab und zerstört die Hierarchie.

Irgendwelche Vorschläge?

Antwort

1

Ich stelle mir Sie sich beziehen this code und die „Abflachung“ Sie erwähnen, wird von Linien gemacht 51-52:

if isinstance(obj, db.GqlQuery): 
     return list(obj) 

, während der Rest des Codes für Ihre Zwecke in Ordnung ist. Also, wie möchten Sie eine GQL-Abfrage darstellen, da Sie nicht wissen, was ein JS-Array (Python-Liste) der darin enthaltenen Objekte ist? Es ist nicht klar, außer der Entitätsgruppe (die du vollständig wiederherstellst), was ihr die Hierarchie gibt; Ist es ein Problem von "Eltern"?

Wie auch immer, sobald dies geklärt ist, scheint es am besten zu sein, diese Datei in Ihren eigenen Code zu kopieren und zu bearbeiten (sie ist nicht dazu gedacht, Sie nur diesen einen Leckerbissen außer Kraft zu setzen).

+0

Es ist ein Problem von "Eltern" und erlaubt das als die Hierarchie. Ich könnte die vorhandene Bibliothek ändern, aber ich dachte, ich würde hier zuerst überprüfen, ob es eine Bibliothek gab, die es bereits unterstützt. – Christian

+0

@Christian, gutes Denken, aber ich kenne keinen. Ich schlage vor, Sie extrahieren diese 'list (obj)' in eine separate Methode, damit die Basisklasse unveränderte Funktionalität haben kann und eine Unterklasse die Methode überschreiben und die zusätzliche Verarbeitung ausführen kann, die Sie benötigen (ich nehme an, dass Sie eine geschachtelte Liste von Listen wollen) ?), während 99% der Funktionalität der Basisklasse wiederverwendet werden - ein solcher Patch könnte in die Open-Source-Teile der App-Engine aufgenommen werden, und dann müssten Sie ihn in Zukunft nicht mehr selbst pflegen. –