Einfachster Weg ein einfaches Klassenobjekt mit simplejson zu serialisieren?
Ich versuche zu serialisieren einer Liste von python-Objekte mit JSON (mit simplejson) und erhalte die Fehlermeldung, dass das Objekt "nicht als JSON serialisierbar".
Die Klasse ist eine einfache Klasse mit Feldern, die nur ganze zahlen, strings, und schwimmt, und erbt ähnliche Felder aus einer übergeordneten Superklasse, z.B.:
class ParentClass:
def __init__(self, foo):
self.foo = foo
class ChildClass(ParentClass):
def __init__(self, foo, bar):
ParentClass.__init__(self, foo)
self.bar = bar
bar1 = ChildClass(my_foo, my_bar)
bar2 = ChildClass(my_foo, my_bar)
my_list_of_objects = [bar1, bar2]
simplejson.dump(my_list_of_objects, my_filename)
wo foo, bar, sind einfache Typen wie ich oben erwähnt habe. Die einzige heikle Sache ist, die ChildClass manchmal hat ein Feld, das bezieht sich auf ein anderes Objekt (von einer Art, die nicht ParentClass oder ChildClass).
Was ist der einfachste Weg zu serialisieren diese als json-Objekt mit simplejson? Ist es ausreichend, um Sie serialisierbar als ein Wörterbuch? Ist die beste Art, schreiben Sie einfach eine dict Methode für die ChildClass? Schließlich, nicht mit dem Feld mit Bezug zu einem anderen Objekt deutlich die Dinge zu komplizieren? Wenn dem so ist, kann ich meinen code umschreiben, nur einfache Felder in Klassen (z.B. strings/Schwimmer usw.)
danke.
InformationsquelleAutor der Frage user248237dfsf | 2010-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe diese Strategie in der Vergangenheit und war ziemlich glücklich mit ihm: - Codierung benutzerdefinierter Objekte als JSON-Objekt-Literale (wie Python
dict
s) mit der folgenden Struktur:Die im wesentlichen ein eins-Element
dict
dessen einzelne Taste ist eine spezielle Zeichenfolge, die angibt, welche Art von Objekt kodiert ist, und dessen Wert ist eindict
von der Instanz Attribute. Wenn das Sinn macht.Eine sehr einfache Umsetzung von einem encoder und einem decoder (vereinfacht code habe ich tatsächlich verwendet) ist etwa so:
In dieser Implementierung wird davon ausgegangen, dass die Objekte, die Sie kodierende haben
from_dict()
Methode der Klasse, die weiß, wie man erstellen Sie eine Instanz von einemdict
decodiert von JSON.Es ist einfach zu erweitern die encoder-und decoder-Unterstützung von benutzerdefinierten Typen (z.B.
datetime
Objekte).BEARBEITENbeantworten Ihre edit: Die nette Sache über eine Umsetzung wie diese ist, dass es automatisch Kodieren und Dekodieren von Instanzen eines beliebigen Objekts gefunden in der
TYPES
mapping. Das bedeutet, dass es automatisch Griff eine ChildClass etwa so:Sollte das Ergebnis im JSON-so etwas wie die folgenden:
InformationsquelleAutor der Antwort Will McCutchen
Einer Instanz einer benutzerdefinierte Klasse dargestellt werden können, als JSON-formatierten string mit Hilfe der folgenden Funktion:
Dieser Funktion erzeugen von JSON-formatierten string für
einer Instanz einer benutzerdefinierten Klasse,
Wörterbuch, das Instanzen von
benutzerdefinierte Klassen, z.B. Blätter,
Klassen
InformationsquelleAutor der Antwort Alex Kotliarov
Wenn Sie mit Django, es kann leicht getan werden, die über Django ' s serialisierungsprogramme Modul. Mehr info finden Sie hier: https://docs.djangoproject.com/en/dev/topics/serialization/
InformationsquelleAutor der Antwort Ozgur Akcali
Als angegeben in python-JSON-docs //
help(json.dumps)
//>Sollten Sie Sie einfach überschreiben
default()
Methode derJSONEncoder
um einen benutzerdefinierten Typ-Konvertierung, und übergeben Sie es alscls
argument.Hier ist eine, die ich verwenden, um die Abdeckung Mongo ' s spezielle Datentypen (datetime und ObjectId)
Nannte es so einfach wie
InformationsquelleAutor der Antwort Tzury Bar Yochay
Ich habe ein ähnliches problem, aber die
json.dump
Funktion wird nicht aufgerufen von mir.Also, um
MyClass
JSON serialisierbar ohne Angabe einer benutzerdefinierten encoderjson.dump
Sie haben zu Monkey patch der json-encoder.Erstellen Sie zuerst Ihre encoder in Ihrem Modul
my_module
:Dann, wie es beschrieben wird in den Kommentar, monkey patch der json-encoder:
Nun auch ein call of
json.dump
in einer externen Bibliothek (wo Sie nicht ändern, diecls
parameter) für Ihremy_module.MyClass
Objekte.InformationsquelleAutor der Antwort mickours
Dies ist eine Art von hackish und ich bin sicher, es gibt vermutlich viel, was falsch mit es. Allerdings war ich von der Herstellung eines einfachen Skripts und lief ich das Problem, dass ich nicht wollen, um eine Unterklasse mein json-serializer zu serialisieren einer Liste von Modell-Objekten. Ich landete mit list comprehension
Lassen:
Aktiva = Liste von modelobjects
Code:
Bisher scheint geklappt zu haben charmant für meine Bedürfnisse
InformationsquelleAutor der Antwort ThinkBonobo
Ich fühle mich ein bisschen albern, über meine möglichen 2 Lösungen Wiederlesen es jetzt,
natürlich, wenn Sie verwenden, django-rest-Rahmen, diese Rahmen haben einige hervorragende Eigenschaften Objekt für das oben erwähnte problem.
sehen das model-view-Beispiel auf Ihrer website
Wenn Sie nicht mit dem django-rest-framework, das kann trotzdem helfen:
Fand ich 2 nützliche Lösungen für dieses problem auf dieser Seite: (ich mag die zweite am meisten!)
Mögliche Lösung 1 (oder Weg):
David-Kammern-Design, eine schöne Lösung
Ich hoffe, dass David nicht daran, dass ich copy paste seine Lösung hier den code:
Definieren eine Serialisierungs-Methode auf der Instanz-Modell:
ist und er sogar extrahiert die oben beschriebene Methode, so ist es besser lesbar:
Bitte beachtet, es ist nicht meine Lösung, alle Gutschriften geht an den link enthalten. Dachte nur das sollte auf stack overflow.
Dies könnte umgesetzt werden in den Antworten auch.
Lösung 2:
Meine bevorzugt Lösung auf dieser Seite gefunden:
http://www.traddicts.org/webdevelopment/flexible-and-simple-json-serialization-for-django/
Übrigens, ich habe den Autor der zweite und beste Lösung: auf stackoverflow:
Selaux
Ich hoffe, er sieht es, und wir sprechen ab, zu implementieren und zu verbessern, seinen code in einem offenen Lösung?
InformationsquelleAutor der Antwort michel.iamit