Start Debugging

System.Text.Json vs Newtonsoft.Json im Jahr 2026: Welche sollten Sie wählen?

Wählen Sie System.Text.Json für neuen .NET-11-Code: Es ist integriert, rund 2x schneller und das Einzige, das mit Native AOT funktioniert. Greifen Sie nur für JSONPath, TypeNameHandling oder wirklich permissives JSON zu Newtonsoft.Json.

Wenn Sie 2026 neuen Code auf .NET 11 beginnen, verwenden Sie System.Text.Json. Es ist in die Laufzeit integriert, serialisiert etwa doppelt so schnell mit einem Bruchteil der Speicherallokationen und ist das Einzige der beiden, das unter Native AOT läuft. Greifen Sie nur dann zu Newtonsoft.Json, wenn Sie von einer Funktion abhängen, die System.Text.Json noch nicht hat: JSONPath-Abfragen, Typ-Einbettung im Stil von TypeNameHandling oder das Parsen von wirklich fehlerhaftem JSON (einfache Anführungszeichen, Schlüssel ohne Anführungszeichen). Beide Bibliotheken leben 2026, aber sie sind für neue Arbeit nicht mehr gleichwertig.

Jedes Beispiel hier zielt auf <TargetFramework>net11.0</TargetFramework> mit dem .NET 11 SDK und C# 14. System.Text.Json ist die integrierte Version, die mit .NET 11 ausgeliefert wird. Newtonsoft.Json bezieht sich auf Version 13.0.4, veröffentlicht am 2025-12-30, die aktuelle stabile Version auf NuGet.

Die Funktionsmatrix auf einen Blick

Dies ist die Tabelle, für die Sie gekommen sind. Sie ist die praktische Fassung des offiziellen Microsoft-Migrationsleitfadens, reduziert auf die Entscheidungen, die tatsächlich ändern, welches Paket Sie referenzieren.

AspektSystem.Text.Json (.NET 11)Newtonsoft.Json 13.0.4
IntegriertJa, Teil der LaufzeitNein, NuGet-Paket
Durchsatz (serialisieren)Basis, am schnellsten~2x langsamer
AllokationenSpan-basiert, niedrigHöher
Native AOT / TrimmingJa, über Source GeneratorNein
Standard-PermissivitätStrikt (RFC 8259)Permissiv
Kommentare / abschließende KommasOptionalStandardmäßig aktiv
Abgleich ohne Groß-/KleinschreibungOptional (in ASP.NET Core aktiv)Standardmäßig aktiv
Polymorphe (De-)SerialisierungJa, seit .NET 7 ([JsonDerivedType])Ja (TypeNameHandling)
TypeNameHandling.All (CLR-Typ einbetten)Nein, by designJa
JSONPath / SelectTokenNeinJa
LINQ-to-JSON DOMJsonNode / JsonDocumentJObject / JArray
DataTable, ExpandoObject, BigIntegerBenutzerdefinierter Konverter erforderlichIntegriert
Einfache Anführungszeichen, Schlüssel ohne AnführungszeichenAbgelehnt, by designAkzeptiert
WartungsstatusAktive EntwicklungWartungsmodus
LizenzMITMIT

Die Schlagzeile lautet: Die Zeilen, in denen Newtonsoft.Json noch gewinnt, sind eng und spezifisch, während die Zeilen, in denen System.Text.Json gewinnt (integriert, AOT, Geschwindigkeit), auf fast jedes neue Projekt zutreffen.

Wann Sie System.Text.Json wählen sollten

Wählen Sie es als Standard für alles Neue auf .NET 11. Konkret:

Ein durch den Source Generator erzeugter Kontext ist das Muster, das AOT und den schnellsten Start freischaltet:

// .NET 11, C# 14 - compile-time metadata, no runtime reflection
using System.Text.Json;
using System.Text.Json.Serialization;

[JsonSerializable(typeof(WeatherForecast))]
public partial class AppJsonContext : JsonSerializerContext;

var forecast = new WeatherForecast(DateOnly.FromDateTime(DateTime.Now), 22, "Mild");

// Pass the generated TypeInfo, not the raw type, to stay reflection-free
string json = JsonSerializer.Serialize(forecast, AppJsonContext.Default.WeatherForecast);

public record WeatherForecast(DateOnly Date, int TemperatureC, string Summary);

System.Text.Json hat außerdem die meisten historischen Lücken geschlossen. Seit .NET 7 führt es polymorphe (De-)Serialisierung über [JsonDerivedType] durch, und .NET 9 fügte mehrere lange gewünschte Optionen hinzu: RespectNullableAnnotations, um nicht-nullbare Referenztypen zu berücksichtigen, das Attribut JsonStringEnumMemberName, um Enum-Werte umzubenennen, und JsonSchemaExporter, um aus einem .NET-Typ ein JSON-Schema zu erzeugen. .NET 10 fügte die direkte Deserialisierung aus einem PipeReader und einen einzeiligen strikten Preset hinzu:

// .NET 10 and later - the strict, spec-compliant defaults in one preset
var options = JsonSerializerOptions.Strict;

// .NET 10 and later - deserialize straight from a PipeReader, no stream adapter
WeatherForecast? f = await JsonSerializer.DeserializeAsync<WeatherForecast>(pipeReader);

Wann Sie Newtonsoft.Json wählen sollten

Es gibt noch echte Gründe, dazu zu greifen. Wählen Sie Newtonsoft.Json, wenn Sie auf eines davon stoßen:

Der Unterschied bei der Standard-Permissivität ist der, der bei einer Migration zubeißt. Dieselbe Nutzlast verhält sich unterschiedlich:

// Newtonsoft.Json 13.0.4 - lenient by default, this parses fine
using Newtonsoft.Json;

var config = JsonConvert.DeserializeObject<Config>("""
{
    "Name": "api", // inline comment
    "Retries": 3,
}
""");

public record Config(string Name, int Retries);
// .NET 11, System.Text.Json - strict by default, the same input throws JsonException
using System.Text.Json;

// You must opt in to match Newtonsoft.Json's leniency
var options = new JsonSerializerOptions
{
    ReadCommentHandling = JsonCommentHandling.Skip,
    AllowTrailingCommas = true,
    PropertyNameCaseInsensitive = true
};
var config = JsonSerializer.Deserialize<Config>(input, options);

Diese Striktheit ist die häufigste Ursache für die Überraschung nach der Migration, bei der eine Nutzlast, die jahrelang funktionierte, plötzlich eine Ausnahme wirft, was auch der Grund ist, warum Fehler wie ein JSON-Wert, der nicht konvertiert werden konnte oder ein DateTime, das nicht geparst wird direkt nach einem Wechsel auftauchen.

Was die Benchmarks tatsächlich zeigen

Leistung ist die Behauptung, die sich am leichtesten verschwommen abhandeln lässt, also hier konkrete Zahlen statt des Wortes “schneller”. Veröffentlichte BenchmarkDotNet-Läufe auf .NET 10, die eine Sammlung von 10.000 einfachen POCO-Objekten serialisieren, zeigen, dass System.Text.Json in etwa 3,7 ms abschließt und dabei 3,4 MB allokiert, gegenüber Newtonsoft.Json mit etwa 7,6 ms und 8,1 MB für dieselbe Arbeitslast.

Metrik (10.000 POCOs serialisieren)System.Text.JsonNewtonsoft.Json 13.x
Mittlere Zeit~3,7 ms~7,6 ms
Allokiert~3,4 MB~8,1 MB
Relativ1,0x (Basis)~2,0x langsamer, ~2,4x Speicher

Methodik und Vorbehalte sind wichtig, lesen Sie diese Zahlen also ehrlich:

Die Zusammenfassung ist über jeden glaubwürdigen Benchmark von 2025 und 2026 hinweg konsistent: System.Text.Json ist etwa doppelt so schnell und allokiert für den Standardfall ungefähr die Hälfte bis ein Drittel. Die Spanne hat sich nicht zugunsten von Newtonsoft.Json verengt.

Die Details, die für Sie entscheiden

Manchmal beendet eine einzige Einschränkung die Entscheidung, bevor Vorlieben den Raum betreten.

Native AOT ist ein geschlossenes Tor. Wenn Ihr Bereitstellungsziel AOT erfordert (ein getrimmter Container, eine Scale-to-Zero-Funktion, ein iOS-Build), ist Newtonsoft.Json schlicht keine Option. Es hängt von Laufzeitreflexion ab, die AOT nicht bereitstellt. Diese eine Tatsache disqualifiziert es für eine ganze Klasse moderner .NET-Arbeitslasten.

Wartungs-Trajektorie. Newtonsoft.Json ist nicht tot und nicht veraltet. James Newton-King, der jetzt bei Microsoft an System.Text.Json selbst arbeitet, veröffentlicht weiterhin Sicherheits- und Bugfix-Releases (13.0.4 erschien am 2025-12-30). Aber es ist explizit im Wartungsmodus: keine größere Funktionsarbeit, keine AOT-Strategie in Sicht. System.Text.Json erhält mit jedem .NET-Release neue Fähigkeiten. Neuen Code auf die aktiv weiterentwickelte Bibliothek zu setzen, ist die risikoärmere Wahl für ein System, das Sie über Jahre pflegen werden.

Referenzbehandlung und Objektzyklen unterscheiden sich. Newtonsoft.Json hat ReferenceLoopHandling und PreserveReferencesHandling. System.Text.Json bildet diese auf ReferenceHandler.IgnoreCycles und ReferenceHandler.Preserve ab, aber das Verhalten ist nicht identisch (IgnoreCycles schreibt null, wo Newtonsoft.Json die Eigenschaft weglässt). Wenn Sie EF-Core-Entitätsgraphen serialisieren, ist dies der Unterschied zwischen einer sauberen Nutzlast und einer Ausnahme wegen eines möglichen Objektzyklus. Wissen Sie, welchen Handler Sie brauchen, bevor Sie migrieren.

Die Lizenzen sind identisch. Beide werden unter MIT ausgeliefert, anders als bei der Situation um MediatR oder AutoMapper ist die Lizenz hier also kein Faktor. Lassen Sie nicht “Ist Newtonsoft.Json noch kostenlos?” die Entscheidung treiben: Es ist es, und System.Text.Json ebenso.

Die Entscheidung, in einer Zeile

Für neuen .NET-11-Code im Jahr 2026: standardmäßig System.Text.Json, und Newtonsoft.Json nur hinzufügen, wenn Sie auf eine konkrete, benannte Funktion stoßen, die es nicht kann (JSONPath, TypeNameHandling, permissives Parsen oder ein nicht unterstützter Typ ohne Konverter). Es ist integriert, schneller, AOT-fähig und das, woran Microsoft weiterhin baut. Behalten Sie Newtonsoft.Json in bestehenden Systemen, die von seiner Flexibilität abhängen; überstürzen Sie keine Migration, die keinen Nutzen bringt, aber beginnen Sie auch nicht dort. Der strategische Standard kippte vor Jahren, und 2026 ist die Lücke breit genug, dass die Beweislast auf der Wahl von Newtonsoft.Json liegt, nicht auf der Wahl der integrierten Bibliothek.

Verwandt

Quellen

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Zurück