Custom JsonConverter mit System.Text.Json
Custom JsonConverter mit System.Text.Json
Die Bibliothek System.Text.Json bietet Funktionen, um Daten in und aus JSON zu konvertieren. Seit .NET Core 3.1 ist die Bibliothek Teil des .NET Frameworks und muss nicht mehr manuell installiert werden.
In manchen Fällen ist es allerdings erforderlich, das Verhalten der Serialisierung oder Deserialisierung anzupassen und eigene Regeln zu definieren. Dafür bietet System.Text.Json die Möglichkeit, benutzerdefinierte JsonConverter zu erstellen.
Beispiel
Du hast die Klassen Person und Address. Ein Person-Objekt enthält ein Address-Objekt mit der Adresse der Person:
Nun möchtest du die Klasse Person ins JSON-Format umwandeln. Allerdings sollte die Struktur dabei abgeflacht sein, damit alle Eigenschaften der Adresse direkt dem Person-Objekt untergeordnet sind.
JsonConverter
Hier kommt der benutzerdefinierte JsonConverter ins Spiel. Dafür wird eine neue Klasse erstellt, welche vom Typ JsonConverter erbt. Diese Klasse muss die Methoden Read und Write überschreiben.
Nun kann die Logik hinter der De- und Serialisierung selbst definiert werden.
Write-Methode
Um das Person-Objekt abgeflacht darzustellen, werden in der Write-Methode zunächst die zwei Eigenschaften des Vor- und Nachnamen ins JSON geschrieben. Anschliessend werden die Eigenschaften im untergeordneten Address-Objekt direkt ins übergeordnete Person-JSON-Objekt geschrieben:
Read-Methode
Damit das benutzerdefinierte JSON wieder erfolgreich in ein Person-Objekt umgewandelt werden kann, muss die Read-Methode ebenfalls definiert werden. Mithilfe eines Switch-Case werden die Eigenschaften je nach Name im Person-Objekt oder im Address-Objekt erfasst:
Custom JsonConverter anwenden
Um den Custom JsonConverter nun zu verwenden, müssen beim De- und Serialisieren die JsonSerializerOptions mitgegeben werden. Darin wird der gewünschte JsonConverter (in diesem Fall der PersonConverter) angegeben.
JSON Ausgabe mit Default Converter:
JSON Ausgabe mit PersonConverter:
Alternativen
Wer die Bibliothek Newtonsoft.Json verwendet, hat ebenfalls die Option, benutzerdefinierte Converters zu erstellen. Eine Anleitung gibt es auf der offiziellen Seite von Newtonsoft.
Eine weitere Möglichkeit wäre das Erstellen einer eigenen Klasse, welche die komplette Logik für das De- und Serialisieren enthält, ohne dabei auf eine Bibliothek wie System.Text.Json oder Newtonsoft.Json zurückzugreifen. Diese Option bedeutet allerdings einen deutlich höheren Zeitaufwand und ist weniger flexibel.
Fazit
Custom JsonConverter bieten eine flexible Möglichkeit, die JSON-Verarbeitung anzupassen. In manchen Fällen kann die Erstellung komplexer Converter allerdings zeitaufwändig sein und dazu führen, dass der Code schwerer lesbar und wartbar wird. Deshalb ist es wichtig, die Verwendung von Custom JsonConverter abzuwägen. In vielen Fällen können auch eingebaute Optionen von System.Text.Json das gewünschte Verhalten erzielen, ohne auf einen Custom JsonConverter zurückgreifen zu müssen.
Kommentare
Kommentar veröffentlichen