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]: RespectNullable
Annotations
- 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