Ich habe eine ganze Weile ohne Erfolg gesucht. Mein Projekt verwendet kein Django. Gibt es eine einfache Möglichkeit, App Engine-Modelle (google.appengine.ext.db.Model) in JSON zu serialisieren, oder muss ich meinen eigenen Serializer schreiben?
Modell:
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')
python
json
google-app-engine
user111677
quelle
quelle
json.dumps(db.to_dict(Photo))
Dies ist die einfachste Lösung, die ich gefunden habe. Es sind nur 3 Codezeilen erforderlich.
Fügen Sie Ihrem Modell einfach eine Methode hinzu, um ein Wörterbuch zurückzugeben:
SimpleJSON funktioniert jetzt ordnungsgemäß:
quelle
In der neuesten Version (1.5.2) des App Engine SDK wurde eine
to_dict()
Funktion eingeführt, mit der Modellinstanzen in Wörterbücher konvertiert werdendb.py
. Siehe die Versionshinweise .Es gibt noch keinen Hinweis auf diese Funktion in der Dokumentation, aber ich habe es selbst versucht und es funktioniert wie erwartet.
quelle
AttributeError: 'module' object has no attribute 'to_dict'
wenn ichfrom google.appengine.ext import db
und benutzesimplejson.dumps(db.to_dict(r))
(wobei r eine Instanz einer db.Model-Unterklasse ist). Ich sehe "to_dict" nicht in google_appengine / google / appengine / ext / db / *Fügen Sie zum Serialisieren von Modellen einen benutzerdefinierten JSON-Encoder wie im folgenden Python hinzu:
Dies wird codieren:
Um das Datum zu dekodieren, können Sie dieses Javascript verwenden:
Hinweis: Vielen Dank an den Benutzer pydave, der diesen Code bearbeitet hat, um ihn besser lesbar zu machen. Ich hatte ursprünglich Pythons if / else-Ausdrücke verwendet, um
jsonEncoder
in weniger Zeilen wie folgt auszudrücken : (Ich habe einige Kommentare hinzugefügt und verwendetgoogle.appengine.ext.db.to_dict
, um es klarer als das Original zu machen.)quelle
Sie müssen keinen eigenen "Parser" schreiben (ein Parser würde JSON vermutlich in ein Python-Objekt verwandeln), aber Sie können Ihr Python-Objekt trotzdem selbst serialisieren.
Verwenden von simplejson :
quelle
Für einfache Fälle gefällt mir der hier am Ende des Artikels befürwortete Ansatz :
Der Artikel enthält am anderen Ende des Spektrums auch eine komplexe Serializer-Klasse, die Djangos bereichert (und erfordert
_meta
- nicht sicher, warum Fehler über _meta fehlen, möglicherweise den hier beschriebenen Fehler ), mit der Fähigkeit, berechnete Serialisierungen durchzuführen Eigenschaften / Methoden. Die meiste Zeit, die Sie für die Serialisierung benötigen, liegt irgendwo dazwischen, und für diejenigen ist ein introspektiver Ansatz wie der von @David Wilson möglicherweise vorzuziehen.quelle
Auch wenn Sie Django nicht als Framework verwenden, stehen Ihnen diese Bibliotheken weiterhin zur Verfügung.
quelle
Wenn Sie den App-Engine-Patch verwenden , wird das
_meta
Attribut automatisch für Sie deklariert , und Sie können es verwendendjango.core.serializers
Sie es wie gewohnt bei Django-Modellen verwenden (wie im Code des Schlittens).App-Engine-Patch hat einige andere coole Funktionen wie eine Hybrid-Authentifizierung (Django + Google-Konten), und der Admin-Teil von Django funktioniert.
quelle
Die Antwort von Mtgred oben hat wunderbar für mich funktioniert - ich habe sie leicht modifiziert, damit ich auch den Schlüssel für den Eintrag bekommen konnte. Nicht so wenige Codezeilen, aber es gibt mir den eindeutigen Schlüssel:
quelle
Ich habe die von dpatru geschriebene JSON Encoder-Klasse erweitert, um Folgendes zu unterstützen:
Filtereigenschaften - Nur Eigenschaften mit a
verbose_name
werden in JSON codiertquelle
Wie von https://stackoverflow.com/users/806432/fredva erwähnt , funktioniert das to_dict hervorragend. Hier ist mein Code, den ich benutze.
quelle
Es gibt eine Methode "Model.properties ()", die für alle Modellklassen definiert ist. Es gibt das Diktat zurück, das Sie suchen.
Siehe Modelleigenschaften in den Dokumenten.
quelle
TypeError: <google.appengine.ext.db.StringProperty object at 0x4694550> is not JSON serializable
Zum Serialisieren einer Datenspeichermodellinstanz können Sie json.dumps nicht verwenden (nicht getestet, aber Lorenzo hat darauf hingewiesen). Vielleicht funktioniert in Zukunft Folgendes.
http://docs.python.org/2/library/json.html
quelle