System.Text.Json

Eintrag zuletzt aktualisiert am: 19.11.2023

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/]).

Highlights der Neuerungen in System.Text.Json 6.0 (erschienen Nov 2021 zusammen mit .NET 6.0)

Highlights der Neuerungen in System.Text.Json 7.0 (erschienen Nov 2022 zusammen mit .NET 7.0)