Čtečka metadat System.Text.Json teď nerozeznačí názvy vlastností metadat.

Knihovna System.Text.Json byla aktualizována, aby zrušila escapování názvů vlastností metadat. Tato změna ovlivňuje, jak se dokumenty JSON interpretují v kontextu zachování odkazu, polymorfismu a ověřování vlastností metadat.

Verze byla představena

.NET 9

Předchozí chování

Dříve System.Text.Json neodstraňovala kódování názvů vlastností metadat. To by vedlo k přijetí neplatných názvů vlastností, což by mohlo obejít ověření vlastnosti metadat.

Například následující kód bude úspěšný při prvním volání, ale vyvolá výjimku ve druhém volání:

JsonSerializerOptions options = new() { ReferenceHandler = ReferenceHandler.Preserve };
JsonSerializer.Deserialize<MyPoco>("""{"\u0024invalid" : 42 }""", options);
JsonSerializer.Deserialize<MyPoco>("""{"$invalid" : 42 }""", options);

record MyPoco;

Nezachytávání chování může také způsobit problémy s polymorfismu při zaokrouhlování vlastností metadat, jejichž názvy vyžadují zapouzdření, jak je vidět tady:

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;

Nové chování

System.Text.Json nyní zrušte zobrazení názvů vlastností metadat. Toto nové chování znamená, že řádek Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); z příkladu polymorfní deserializace nyní vrací true, a neplatné názvy vlastností se nyní správně neodeserializují s následující výjimkou:

Unhandled exception. System.Text.Json.JsonException: Properties that start with '$' are not allowed in types that support metadata.

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

Tato změna zlepšuje správnost a spolehlivost tím, že zajišťuje, aby názvy vlastností metadat byly správně odstraněny z únikových znaků, čímž se zabrání obcházení ověřování vlastností metadat. Další podrobnosti najdete v nahlášeném problému.

Nepoužívejte escapování k obejití ověřování vlastností metadat. Místo toho vyberte názvy vlastností, které nejsou v konfliktu s vlastnostmi metadat.

Ovlivněná rozhraní API