HOWTO · Python

Wie man ein Python-Klassenobjekt in JSON serialisiert

Dieses Tutorial informiert über die Serialisierung in Python und demonstriert die JSON-Serialisierung von Python-Klassen.

Auf dieser Seite

Eine benutzerdefinierte Python-Instanz kann nicht direkt an den Standard-json-Encoder übergeben werden. Wandeln Sie sie zuerst in JSON-kompatible Werte um und verwenden Sie dann json.dumps(), wenn Sie JSON-Text benötigen. Um diesen Text stattdessen in ein dateiähnliches Objekt zu schreiben, verwenden Sie json.dump().

Serialisierung in Python

Serialisierung wandelt Daten in eine Darstellung um, die gespeichert oder übertragen und später rekonstruiert werden kann. JSON unterstützt Objekte, Arrays, Strings, Zahlen, Booleans und null; in Python entsprechen diese Dictionaries, Listen, Strings, Zahlen, Booleans und None. Eine Instanz einer benutzerdefinierten Klasse hat keine automatische JSON-Darstellung, also müssen Sie entscheiden, welche ihrer Attribute offengelegt und in diese unterstützten Werte umgewandelt werden sollen.

Eine Python-Klasse JSON-serialisierbar machen

Der JSON-Encoder verarbeitet eingebaute Python-Werte, auch verschachtelte Dictionaries und Listen. Übergeben Sie für eine benutzerdefinierte Instanz eine default-Funktion an json.dumps(), die jede angetroffene Instanz in ein Dictionary umwandelt. Dies funktioniert auch für verschachtelte benutzerdefinierte Objekte, solange die Umwandlung Werte zurückgibt, die der Encoder verarbeiten kann.

Die Methode toJSON() verwenden, um eine Klasse JSON-serialisierbar zu machen

toJSON() ist ein gewöhnlicher Methodenname, den der Autor der Klasse wählt. Das json-Modul von Python ruft ihn nicht automatisch auf. Eine Möglichkeit besteht darin, das default-Argument des Encoders zu verwenden und die Methode den JSON-Text zurückgeben zu lassen:

Führen Sie dieses Beispiel aus:

import json


class Pet:
    def __init__(self, name):
        self.name = name


class Person:
    def __init__(self, name, age, pet):
        self.name = name
        self.age = age
        self.pet = pet

    def toJSON(self):
        return json.dumps(self, default=lambda value: value.__dict__, sort_keys=True)


person = Person("Kelvin", 20, Pet("Brunno"))
print(person.toJSON())

Dieses Beispiel wird als ausführbarer Code bereitgestellt, aber es liegt kein Ausführungsergebnis dafür vor. Seine Ausgabe wurde hier daher nicht überprüft. Der default-Callback wird sowohl auf Person als auch auf das verschachtelte Pet angewendet; wenn ein Attribut selbst nicht unterstützt wird, fügen Sie auch für diesen Wert eine Umwandlungsregel hinzu.

Die JSON-Serialisierung in der Klasse kapseln

Eine Klasse kann den Umwandlungsschritt auch selbst übernehmen und ein Dictionary mit JSON-kompatiblen Werten zurückgeben. Übergeben Sie dieses Dictionary dann an json.dumps(). Eine Dataclass ist nützlich, wenn ihre Felder bereits die offenzulegenden Daten beschreiben:

from dataclasses import asdict, dataclass
import json


@dataclass
class Student:
    id: int
    name: str

    def toJSON(self):
        return asdict(self)


student = Student(id=1, name="Kelvin")
json_text = json.dumps(student.toJSON())
print(json_text)

Auch dieses Beispiel wurde hier nicht ausgeführt. asdict() wandelt die Felder der Dataclass in ein Dictionary um; json.dumps() gibt dann JSON-Text zurück. Verwenden Sie für die Dateiausgabe stattdessen json.dump(student.toJSON(), file_object) mit einem geöffneten dateiähnlichen Objekt, anstatt die zurückgegebene Zeichenfolge auszugeben. Keiner der beiden Ansätze macht beliebige verschachtelte Python-Objekte serialisierbar, es sei denn, diese Werte werden ebenfalls umgewandelt.