Benutzerdefinierte JSON-Objekte ohne benutzerdefinierte Encoder serialisierbar machen
Die benutzerdefinierte JSON-Serialisierung nicht serialisierbarer Objekte erfordert normalerweise die Erweiterung von json.JSONEncoder und das Hinzufügen eines benutzerdefinierten Encoder zu json.dumps(). Es ist jedoch möglich, Objekte mit dem Standard-Encoder serialisierbar zu machen, wodurch triviale benutzerdefinierte Encoder überflüssig werden.
Monkey-Patching des Standard-Encoders
Der Standard-Encoder kann sein geändert (mit Affen gepatcht), um nach einer speziellen Methode in Objekten wie to_json() zu suchen und diese für die Serialisierung zu verwenden. Dies kann durch Neudefinition von JSONEncoder.default() in einem Modul erreicht werden, das bei der Paketinitialisierung importiert wurde.
Automatische Serialisierung mit Pickle
Eine umfassendere Lösung beinhaltet die Verwendung des Pickle-Moduls um Objekte auszuwählen, die keine Standard-JSON-Datentypen sind. Dieser Ansatz ermöglicht die automatische Serialisierung der meisten Python-Objekte, einschließlich benutzerdefinierter Klasseninstanzen, ohne dass spezielle Methoden erforderlich sind.
Deserialisierung
Um eingelegte Objekte zu deserialisieren, ein benutzerdefinierter object_hook Die Funktion kann für json.loads() bereitgestellt werden. Diese Funktion würde Objekte mit _python_object-Schlüsseln entpacken und sie in ihrem ursprünglichen Python-Zustand wiederherstellen.
Python 3-Portabilität
In Python 3 gibt json.dumps() Byte-Objekte zurück , die für die Pickle-Serialisierung geändert werden müssen. Das Ergebnis von pickle.dumps() kann in latin1 dekodiert und dann vor der Verwendung von pickle.loads() wieder in latin1 kodiert werden.
Beispiel
Betrachten Sie ein Modul namens make_json_serializable2 das das Monkey-Patching und die Pickle-basierte automatische Serialisierung implementiert:
<code class="python">from json import JSONEncoder import pickle def _default(self, obj): return {'_python_object': pickle.dumps(obj).decode('latin1')} JSONEncoder.default = _default # Replace the default method.</code>
Um dieses Modul zu verwenden, importieren Sie es einfach und die Serialisierung wird automatisch angewendet:
<code class="python">import make_json_serializable2 # Custom class 'Foo' is now implicitly JSON serializable class Foo: def __init__(self, name): self.name = name # Serialize and deserialize using the default JSON encoder data = [Foo('Bar')] json_string = json.dumps(data) data2 = json.loads(json_string) print(data2 == data) # True</code>
Dieser Ansatz bietet eine einfache und allgemeine Methode, um benutzerdefinierte Objekte JSON-serialisierbar zu machen, ohne dass manuelle benutzerdefinierte Encoder erforderlich sind.
Das obige ist der detaillierte Inhalt vonWie mache ich benutzerdefinierte JSON-Objekte ohne benutzerdefinierte Encoder serialisierbar?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!