2009-08-19 8 views
1

J'ai un grand ensemble de données hiérarchiques dans le magasin de données App Engine. La hiérarchie est conservée en stockant les données dans les groupes d'entités, afin que je puisse tirer un arbre tout en sachant simplement la clé de l'élément haut comme ceci:Sortie de données hiérarchiques à partir de la banque de données App Engine vers JSON?

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

La question: Comment puis-je maintenant la sortie de ces données comme JSON et préserver la hiérarchie?

Google a une classe d'utilitaires appelée GqlEncoder qui ajoute le support des résultats de la requête de banque de données à simplejson, mais il aplatit les données, ce qui détruit la hiérarchie.

Des suggestions?

Répondre

1

Je suppose que vous faites allusion this code et le « aplatissement » que vous mentionnez est fait par des lignes 51-52:

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

tandis que le reste du code est très bien à vos besoins. Alors, comment voulez-vous représenter une requête GQL, puisque vous ne faites pas un tableau JS (liste Python) des objets qu'il contient? Ce n'est pas clair, à part le groupe d'entités (que vous récupérez entièrement), ce qui lui donne la hiérarchie; Est-ce un problème de "parent"? Quoi qu'il en soit, une fois cela clarifié, copier et éditer ce fichier dans votre propre code semble le mieux (il n'est pas conçu pour vous permettre de surcharger seulement cette friandise).

+0

C'est un problème de 'parent' et de permettre cela en tant que hiérarchie. Je pourrais modifier la bibliothèque existante, mais j'ai pensé que je verrais d'abord ici s'il y avait une bibliothèque qui la supportait déjà. – Christian

+0

@ Christian, bonne réflexion, mais je ne connais pas. Je suggère d'extraire cette utilisation 'list (obj)' dans une méthode séparée afin que la classe de base puisse avoir des fonctionnalités inchangées et qu'une sous-classe puisse surcharger la méthode et effectuer le traitement supplémentaire dont vous avez besoin (je suppose que vous voulez une liste de listes imbriquée ?) tout en réutilisant 99% des fonctionnalités de la classe de base - un tel correctif pourrait être accepté dans les parties open source du moteur d'application, et vous n'auriez pas besoin de le maintenir vous-même à l'avenir. –

Questions connexes