La sérialisation JSON de Google App Engine modèles
J'ai cherché pendant un bon moment, sans succès. Mon projet n'est pas à l'aide de Django, est-il un moyen simple de sérialiser l'Application de modèles de Moteurs (google.appengine.ext.db.Modèle) en JSON ou dois-je écrire mon propre sérialiseur?
Modèle:
class Photo(db.Model):
filename = db.StringProperty()
title = db.StringProperty()
description = db.StringProperty(multiline=True)
date_taken = db.DateTimeProperty()
date_uploaded = db.DateTimeProperty(auto_now_add=True)
album = db.ReferenceProperty(Album, collection_name='photo')
Vous devez vous connecter pour publier un commentaire.
Une simple fonction récursive peut être utilisé pour convertir une entité (et de toute référents) à un imbriquée dictionnaire qui peut être transmis à
simplejson
:json.dumps(db.to_dict(Photo))
C'est la solution la plus simple que j'ai trouvé. Il nécessite seulement 3 lignes de codes.
Simplement ajouter une méthode à votre modèle de retourner un dictionnaire:
SimpleJSON fonctionne désormais correctement:
django.utils
, qui a vraiment fait c'est facile!Dans la dernière (1.5.2) à la sortie de l'App Engine SDK, un
to_dict()
fonction qui convertit les instances de modèle à des dictionnaires a été introduit dansdb.py
. Voir la notes de version.Il n'y a pas de référence à cette fonction dans la documentation pour l'instant, mais j'ai essayé moi-même et il fonctionne comme prévu.
AttributeError: 'module' object has no attribute 'to_dict'
quand jefrom google.appengine.ext import db
et l'utilisationsimplejson.dumps(db.to_dict(r))
(où r est une instance d'une db.Modèle de sous-classe). Je ne vois pas "to_dict" dans google_appengine//google appengine/ext/db/*Pour sérialiser des modèles, ajouter des json encodeur comme dans le python suivant:
Ce code:
Pour décoder la date, vous pouvez utiliser ce code javascript:
Note: Merci à l'utilisateur pydave qui a modifié ce code pour le rendre plus lisible. J'avais eu à l'origine utilisé python si/d'autre des expressions pour exprimer
jsonEncoder
en moins de lignes comme suit: (j'ai ajouté quelques commentaires et utiliségoogle.appengine.ext.db.to_dict
, pour la rendre plus claire que l'original.)Vous n'avez pas besoin d'écrire votre propre "parser" (un analyseur ne serait sans doute tourner JSON dans un objet Python), mais vous pouvez toujours sérialiser vos objet Python vous-même.
À l'aide de simplejson:
Pour les cas simples, j'aime l'approche préconisée ici à la fin de l'article:
L'article contient également, à l'autre extrémité du spectre, un complexe sérialiseur classe qui enrichit django (et ne nécessitent
_meta
-- ne savez pas pourquoi vous obtenez une erreur à propos _meta manquant, peut-être le bug décrit ici) avec la capacité de sérialiser calculé les propriétés /méthodes. La plupart du temps, vous sérialisation des besoins se situe quelque part entre les deux, et pour ceux d'une approche introspective comme @David Wilson est peut-être préférable.Même si vous n'êtes pas à l'aide de django comme un cadre, ces bibliothèques sont toujours disponibles pour vous à utiliser.
Si vous utilisez app-engine-patch il déclare automatiquement la
_meta
attribut pour vous, et puis vous pouvez utiliserdjango.core.serializers
comme vous le feriez normalement sur django modèles (comme dans le traîneau du code).App-engine-patch a quelques autres fonctionnalités intéressantes telles dispose d'une authentification hybride (django + comptes google), et la partie admin de django fonctionne.
Mtgred la réponse ci-dessus a fonctionné à merveille pour moi, j'ai légèrement modifié afin que je puisse également obtenir la clé pour l'entrée. Pas que quelques lignes de code, mais il me donne la clé unique:
J'ai étendu le JSON classe de Codeur écrit par dpatru à l'appui:
Propriétés de filtrage - seules les propriétés avec un
verbose_name
sera encodé en JSONComme mentionné par https://stackoverflow.com/users/806432/fredva, le to_dict fonctionne très bien. Voici mon code que j'utilise.
Il y a une méthode, "Modèle.propriétés()", définie pour toutes les classes du Modèle. Il retourne le dict que vous cherchez.
Voir Les propriétés du modèle dans les docs.
TypeError: <google.appengine.ext.db.StringProperty object at 0x4694550> is not JSON serializable
De sérialiser un Modèle du Datastore exemple, vous ne pouvez pas utiliser json.décharges (ne l'ai pas testé mais Lorenzo l'a fait remarquer). Peut-être que dans l'avenir, la suite des travaux.
http://docs.python.org/2/library/json.html