Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De System.Text.Json bibliotheek is bijgewerkt om eigenschapsnamen van metagegevens ongedaan te maken. Deze wijziging is van invloed op de manier waarop JSON-documenten worden geïnterpreteerd in de context van referentiebehoud, polymorfisme en validatie van metagegevenseigenschappen.
Geïntroduceerde versie
.NET 9
Vorig gedrag
Voorheen ontsleutelde System.Text.Json geen metadatavastgoedsnamen. Dit zou ertoe leiden dat ongeldige eigenschapsnamen worden geaccepteerd, waardoor validatie van metagegevenseigenschap kan worden overgeslagen.
De volgende code slaagt bijvoorbeeld in de eerste aanroep, maar genereert een uitzondering in de tweede aanroep:
JsonSerializerOptions options = new() { ReferenceHandler = ReferenceHandler.Preserve };
JsonSerializer.Deserialize<MyPoco>("""{"\u0024invalid" : 42 }""", options);
JsonSerializer.Deserialize<MyPoco>("""{"$invalid" : 42 }""", options);
record MyPoco;
Het gedrag van het ontsnappen kan ook polymorfismeproblemen veroorzaken bij het heen-en-weer converteren van metagegevens waarvan de namen escapings vereisen, zoals hier wordt weergegeven.
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;
Nieuw gedrag
System.Text.Json herstelt nu de oorspronkelijke eigenschapsnamen in metadata. Dit nieuwe gedrag betekent dat de lijn Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); van het polymorfe deserialisatievoorbeeld nu true retourneert, en dat ongeldige eigenschapsnamen correct niet deserialiseren met de volgende uitzondering:
Unhandled exception. System.Text.Json.JsonException: Properties that start with '$' are not allowed in types that support metadata.
Type van brekende verandering
Deze wijziging is een gedragswijziging.
Reden voor wijziging
De wijziging verbetert de juistheid en betrouwbaarheid door ervoor te zorgen dat namen van metagegevenseigenschappen correct worden ontdaan van escape-tekens, waardoor het omzeilen van de validatie van metagegevenseigenschappen wordt voorkomen. Zie het gemelde probleem voor meer informatie.
Aanbevolen actie
Vermijd het gebruik van escape-bewerkingen om validatie van metagegevenseigenschappen te omzeilen. Kies in plaats daarvan eigenschapsnamen die niet conflicteren met metagegevenseigenschappen.