86 votes

Sérialisation JSON de modèles Google App Engine

J’ai été Rechercher pendant un bon moment sans succès. Mon projet n’est pas avec Django, y a-t-il un moyen simple pour sérialiser App Engine modèles (google.appengine.ext.db.Model) en JSON ou je dois écrire mon propre sérialiseur ? Ma classe de modèle est assez simple. Par exemple :

Merci d’avance.

62voto

dmw Points 940

Une fonction récursive simple peut être utilisée pour convertir un dictionnaire imbriqué qui peut être passé à une entité (et des référents) `` :

60voto

Mtgred Points 1177

Il s’agit de la solution la plus simple, j’ai trouvé. Il faut seulement 3 lignes de codes.

Il suffit d’ajouter une méthode à votre modèle pour retourner un dictionnaire :

SimpleJSON fonctionne désormais correctement :

15voto

fredva Points 141

Dans la dernière version (1.5.2) du kit de développement logiciel App Engine, une fonction to_dict() convertissant les instances de modèle en dictionnaires a été introduite sous forme de db.py . Voir les notes de version .

Il n’ya pas encore de référence à cette fonction dans la documentation, mais j’ai essayé moi-même et cela fonctionne comme prévu.

7voto

dpatru Points 353

Pour sérialiser des modèles, ajouter des json encodeur comme dans le python suivant:

import datetime
from google.appengine.api import users
from google.appengine.ext import db
from django.utils import simplejson

class jsonEncoder(simplejson.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.isoformat()

        elif isinstance(obj, db.Model):
            return dict((p, getattr(obj, p)) 
                        for p in obj.properties())

        elif isinstance(obj, users.User):
            return obj.email()

        else:
            return simplejson.JSONEncoder.default(self, obj)


# use the encoder as: 
simplejson.dumps(model, cls=jsonEncoder)

Ce code:

  • une date comme isoformat chaîne de caractères (par cette suggestion),
  • un modèle comme dict de ses propriétés,
  • un utilisateur que son e-mail.

Pour décoder la date, vous pouvez utiliser ce code javascript:

function decodeJsonDate(s){
  return new Date( s.slice(0,19).replace('T',' ') + ' GMT' );
} // Note that this function truncates milliseconds.

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.)

class jsonEncoder(simplejson.JSONEncoder):
  def default(self, obj):
    isa=lambda x: isinstance(obj, x) # isa(<type>)==True if obj is of type <type>
    return obj.isoformat() if isa(datetime.datetime) else \
           db.to_dict(obj) if isa(db.Model) else \
           obj.email()     if isa(users.User) else \
           simplejson.JSONEncoder.default(self, obj)

4voto

Jonathan Feinberg Points 24791

Vous n'avez pas besoin d'écrire votre propre "analyseur" (un analyseur transformerait probablement JSON en objet Python), mais vous pouvez quand même sérialiser votre objet Python vous-même.

En utilisant simplejson :

 import simplejson as json
serialized = json.dumps({
    'filename': self.filename,
    'title': self.title,
    'date_taken': date_taken.isoformat(),
    # etc.
})
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X