System.Text.Json (STJ)

Eintrag zuletzt aktualisiert am: 18.11.2024

Microsoft kehrt seit .NET Core 3.0 ab von JSON.NET und wirft mit dem Nuget-Paket System.Text.Json (manchmal von Microsoft abgekürzt als "STJ") einen neuen JSON-Serializer in den Ring, der schneller als JSON.NET ist, aber nicht alle Funktionen wie JSON.NET bietet.

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".

Kompatibilität

Im Gegensatz zu anderen Teilen des modernen .NET (z.B. ASP.NET Core und Blazor) läuft System.Text.Json nicht nur auf dem modernen .NET, sondern auch auf deutlich älteren .NET-Versionen. System.Text.Json funktioniert mit dem klassischen .NET Framework ab Version 4.6.2 und dem modernen .NET ab Version 2.0. Dazu ist die Bibliothek als NuGet-Paket verfügbar.

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)

Highlights der Neuerungen in System.Text.Json 8.0 (erschienen Nov 2023 zusammen mit .NET 8.0)

Highlights der Neuerungen in System.Text.Json 9.0 (erschienen Nov 2024 zusammen mit .NET 9.0)

Neue Einstellungen in JsonSerializerOptions
- Berücksichtigung von Nullable-Kontext und [DisallowNull]: RespectNullableAnnotation
  • Berücksichtigung verpflichtender Konstruktorparameter: RespectRequiredConstructorParameters 
  • Einrückungen anpassen: IndentCharacter und IndentSize
  • Flexibilität bei der Position von Typ-Metadaten ($type): AllowOutOfOrderMetadataProperties
  • JsonSerializerOptions.Web liefert Einstellungen, die ASP.NET Core WebAPI verwendet

Weitere neue Einstellungen
  • Anpassung der Serialisierung von Enumerationsmitgliedsnamen: [JsonStringEnumMemberName("xy")]
  • Lesen von Multi-JSON-Dokumenten: AllowMultipleValues in JsonReaderOptions für Utf8JsonReader 


Weitere Neuerungen
  • Klasse JsonSchemaExporter: Metadaten für JSON-Dokument generieren wie bei OpenAPI
  • Neue Methode DeepEquals() in der Klasse JsonElement