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.
Die System.Text.Json-Bibliothek wurde so aktualisiert, dass das Escaping der Namen von Metadateneigenschaften erfolgt. Diese Änderung wirkt sich darauf aus, wie JSON-Dokumente im Kontext der Referenzarchivierung, Polymorphität und Metadateneigenschaftsüberprüfung interpretiert werden.
Eingeführte Version
.NET 9
Vorheriges Verhalten
Zuvor wurden bei System.Text.Json das Escaping von Metadateneigenschaften nicht durchgeführt. Dies würde dazu führen, dass ungültige Eigenschaftsnamen akzeptiert werden, was die Überprüfung der Metadateneigenschaft umgehen könnte.
Der folgende Code würde beispielsweise im ersten Aufruf erfolgreich sein, löst jedoch eine Ausnahme im zweiten Aufruf aus:
JsonSerializerOptions options = new() { ReferenceHandler = ReferenceHandler.Preserve };
JsonSerializer.Deserialize<MyPoco>("""{"\u0024invalid" : 42 }""", options);
JsonSerializer.Deserialize<MyPoco>("""{"$invalid" : 42 }""", options);
record MyPoco;
Das Unescaping-Verhalten konnte auch zu Polymorphismus-Problemen führen, wenn Metadaten-Eigenschaften, deren Namen escaped werden müssen, umgangen werden, wie hier zu sehen:
string json = JsonSerializer.Serialize<Base>(new Derived());
Console.WriteLine(json); // {"categor\u00EDa":"derived"}
Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); // False
[JsonPolymorphic(TypeDiscriminatorPropertyName = "categoría")]
[JsonDerivedType(typeof(Derived), "derived")]
public record Base;
public record Derived : Base;
Neues Verhalten
System.Text.Json entfernt jetzt das Escaping für Namen von Metadaten-Eigenschaften. Dieses neue Verhalten bedeutet, dass die Zeile Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); aus dem polymorphen Deserialisierungsbeispiel jetzt true zurückgibt und dass ungültige Eigenschaftsnamen korrekt mit der folgenden Ausnahme deserialisiert werden:
Unhandled exception. System.Text.Json.JsonException: Properties that start with '$' are not allowed in types that support metadata.
Art der einschneidenden Änderung
Diese Änderung ist eine Verhaltensänderung.
Grund für Änderung
Die Änderung verbessert die Korrektheit und Zuverlässigkeit, indem sie sicherstellt, dass die Namen von Metadateneigenschaften ordnungsgemäß unescaped werden, wodurch die Umgehung der Validierung von Metadateneigenschaften verhindert wird. Weitere Informationen finden Sie im gemeldeten Problem.
Empfohlene Aktion
Vermeiden Sie die Umgehung der Validierung von Metadateneigenschaften durch Escaping. Wählen Sie stattdessen Eigenschaftennamen aus, die nicht mit Metadateneigenschaften in Konflikt geraten.