Delen via


De metadata-lezer van System.Text.Json verwijdert nu escapes uit metadata-eigendomsnamen.

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.

Vermijd het gebruik van escape-bewerkingen om validatie van metagegevenseigenschappen te omzeilen. Kies in plaats daarvan eigenschapsnamen die niet conflicteren met metagegevenseigenschappen.

Betreffende API's