Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
Doporučená akce
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.