System.Text.Json
Eintrag zuletzt aktualisiert am: 24.11.2022
Microsoft kehrt seit
.NET Core 3.0 ab von JSON.NET und wirft mit dem
Nuget-Paket System.Text.Json einen neuen JSON-Serializer in den Ring, der schneller sein soll, aber es nicht in allen Fällen ist.
Viele Jahre hat Microsoft in .NET bei der Verarbeitung von Dokumenten und
Webserviceaufrufen in der beliebten
JavaScript Object Notation (JSON) auf die
Open Source-Drittanbieter-
Softwarekomponente "Newtonsoft JSON" (alias JSON.NET) von James Newton-King, der mittlerweile für Microsoft in Neuseeland arbeitet, gesetzt. Im Zuge von
.NET Core 3.0 entwickelte das .NET-Entwicklungsteam in Redmond aber nun wieder eine eigene
Softwarekomponente für die JSON-Serialisierung und -
Deserialisierung mit Namen "
System.Text.Json".
Die neue Komponente
System.Text.Json läuft gleichwohl nicht nur ab
.NET Core 3.0, sondern auch ab
.NET Standard Version 2.0, d.h. auch auf
.NET Core 2.0, .NET Framework ab Version 4.6.1, der
Universal Windows Platform (
UWP) ab Version 10.10.16299 und neueren Versionen von
Xamarin.
Vergleich mit Newtonsoft JSON (alias JSON.NET) von James Newton-King
System.Text.Json ist bei der Serialisierung und
Deserialisierung von JSON schneller als JSON.NET.
System.Text.Json beherrscht aber nicht alle Funktionen von JSON.NET und ist auch bei der Serialisierung /
Deserialisierung nicht immer kompatibel.
Warum eine neue JSON-Komponente?
Es gab eine Meinungsverschiedenheit (von einem Zerwürfnis zu sprechen, scheint übertrieben) zwischen James Newton-King und seinem Arbeitgeber Microsoft, die überhaupt der Grund dafür ist, das Microsoft seit
.NET Core 3.0 strategisch von JSON.NET abgekehrt ist. Microsoft wollte, das JSON.NET durch den Einsatz der neueren Speicherzugriffs-APIs (Span<T>) beschleunigt wird. James Newton-King sah in dieser gravierenden Implementierungsänderung aber die Gefahr von Breaking Changes, also dem Verlust der Kompatibilität.
Kommentar von James Newton-King dazu ist: "Unfortunately, Json.NET's wealth of features and popularity works against making major changes to it. Supporting new technologies like Span would require fundamental breaking changes to the library and would disrupt existing applications and libraries that depend on it." (dies wird von Microsoft zitiert in [
https://github.com/dotnet/announcements/issues/90]).
Immerhin gibt es für
ASP.NET Core ab Version 3.0 weiterhin die Option, beim bisherigen JSON.NET bleiben. Dafür installiert man das
Nuget-Paket Microsoft.AspNetCore.Mvc.NewtonsoftJson und ruft in ConfigureServices() die
Methode nach AddControllers() noch AddNewtonsoftJson() auf:
public void ConfigureServices(IServiceCollection services)
{
…
services.AddControllers().AddNewtonsoftJson()
…
}
Dies wird wohl für einige Zeit noch Standard in den meisten
ASP.NET Core WebAPI-Entwicklungsprojekten sein, denn
System.Text.Json hat einen weiteren Mangel: Man kann damit bisher nicht automatisch
Metadaten im
Swagger Open API-Format erzeugen (vgl. "Support for OpenAPI /
Swagger when using
System.Text.Json is ongoing and unlikely to be available as part of the 3.0 release." [
https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/]).
Sind die Inhalte hilfreich?