Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Unter bestimmten Konstellationen, wie beispielsweise Polymorphismus und Referenzerhaltung, reserviert System.Text.Json bestimmte Eigenschaftsnamen (beispielsweise $type, $id und $ref) für das Ausstrahlen von Metadaten. Einige Eigenschaftennamen, z. B. die TypeDiscriminatorPropertyName können auch mit benutzerdefinierten Namen konfiguriert werden. Zuvor hat der Serialisierer keine Überprüfung durchgeführt, ob diese Eigenschaftsnamen mit benutzerdefinierten Verträgen in Konflikt standen, was zu doppelten Eigenschaften führen und JSON-Code erzeugen konnte, der mehrdeutig war oder das Roundtrip nicht erfolgreich war. Ab .NET 10 ermöglicht System.Text.Json die Validierung, um solche Konfigurationen zu verhindern und Benutzern frühzeitige Warnungen zu bieten.
Eingeführt in Version
.NET 10
Vorheriges Verhalten
Zuvor hat der folgende Code ein ungültiges JSON-Objekt mit doppelten Type-Eigenschaften erstellt und das Deserialisieren mit einem JsonException ist fehlgeschlagen.
using System.Text.Json;
using System.Text.Json.Serialization;
string json = JsonSerializer.Serialize<Animal>(new Dog());
Console.WriteLine(json); // {"Type":"dog","Type":"Dog"}
JsonSerializer.Deserialize<Animal>(json); // JsonException: Deserialized object contains a duplicate 'Type' metadata property.
[JsonPolymorphic(TypeDiscriminatorPropertyName = "Type")]
[JsonDerivedType(typeof(Dog), "dog")]
public abstract class Animal
{
public abstract string Type { get; }
}
public class Dog : Animal
{
public override string Type => "Dog";
}
Neues Verhalten
Ab .NET 10 führt jeder Versuch, denselben Typ zu serialisieren, zu einem frühen Überprüfungsfehler:
InvalidOperationException: Der Typ "Dog" enthält die Eigenschaft "Type", die einen Konflikt mit einem vorhandenen Metadateneigenschaftsnamen verursacht. Erwägen Sie, sie entweder umzubenennen oder mit JsonIgnoreAttribute zu ignorieren.
Dieser Überprüfungsfehler tritt auf, wenn der Serialisierer zum ersten Mal erstellt wird oder wenn die Serialisierung zum ersten Mal versucht wird und eine frühe Erkennung ungültiger Serialisierungsverträge ermöglicht wird.
Art der einschneidenden Änderung
Diese Änderung ist eine Verhaltensänderung.
Grund für Änderung
Diese Änderung bietet frühzeitige Verhinderung ungültiger Serialisierungsverträge. Durch die Vorabvalidierung der Eigenschaftsnamen verhindert der Serialisierer Szenarien, in denen doppelte Eigenschaften erzeugt werden, was zu ungültigem JSON-Code führt, der nicht korrekt umgewandelt werden kann. Dadurch können Entwickler Konfigurationsprobleme während der Entwicklung identifizieren und beheben, anstatt sie zur Laufzeit während der Deserialisierung zu ermitteln.
Weitere Informationen finden Sie unter:
- [STJ] Eigenschaftennamen, die mit Metadateneigenschaftennamen in Konflikt geraten (dotnet/runtime#106390) nicht zulassen
- Typen mit Eigenschaftsnamen, die mit Metadaten in Konflikt stehen, nicht zulassen (dotnet/runtime#106460)
Empfohlene Aktion
Vermeiden Sie die Verwendung von Eigenschaftennamen, die mit System.Text.Json-spezifischen Metadateneigenschaften in Konflikt geraten (z. B., $type, $id und $ref). Wenn eine solche Eigenschaft unbedingt in der Klasse beibehalten werden muss, wenden Sie eine JsonIgnoreAttribute Anmerkung auf die widersprüchliche Eigenschaft an.