Heim  >  Artikel  >  Backend-Entwicklung  >  Wie mache ich benutzerdefinierte JSON-Objekte ohne benutzerdefinierte Encoder serialisierbar?

Wie mache ich benutzerdefinierte JSON-Objekte ohne benutzerdefinierte Encoder serialisierbar?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 03:21:40226Durchsuche

How to Make Custom Objects JSON Serializable without Custom Encoders?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn