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.
V určitých kontextech, jako je polymorfismus a zachování odkazů, System.Text.Json si vyhrazuje konkrétní názvy vlastností (například $type, $ida $ref) pro generování metadat. Některé názvy vlastností, jako je například, TypeDiscriminatorPropertyName lze také nakonfigurovat s vlastními názvy. Serializátor dříve neověřoval, zda názvy těchto vlastností byly v konfliktu s uživatelsky definovanými kontrakty, což mohlo vést k duplicitním vlastnostem a vytvořit JSON, který mohl být nejednoznačný nebo se mu nepodařilo vrátit se zpět. Od verze .NET 10 umožňuje System.Text.Json ověřování zabránit těmto konfiguracím a uživatelům poskytuje včasné upozornění.
Verze byla představena
.NET 10
Předchozí chování
Dříve následující kód vytvořil neplatný objekt JSON s duplicitními Type vlastnostmi a nepodařilo se deserializovat pomocí JsonExceptionpříkazu :
using System.Text.Json;
using System.Text.Json.Serialization;
string json = JsonSerializer.Serialize<Animal>(new Dog());
Console.WriteLine(json); // {"Type":"dog","Type":"Dog"}
JsonSerializer.Deserialize<Animal>(json); // JsonException: Deserialized object contains a duplicate 'Type' metadata property.
[JsonPolymorphic(TypeDiscriminatorPropertyName = "Type")]
[JsonDerivedType(typeof(Dog), "dog")]
public abstract class Animal
{
public abstract string Type { get; }
}
public class Dog : Animal
{
public override string Type => "Dog";
}
Nové chování
Od verze .NET 10 se při každém pokusu o serializaci stejného typu zobrazí chyba předčasného ověření:
InvalidOperationException: Typ Dog obsahuje vlastnost Type, která je v konfliktu s existujícím názvem vlastnosti metadat. Zvažte jeho přejmenování nebo ignorování pomocí JsonIgnoreAttribute.
K této chybě ověření dochází při prvním vytvoření serializátoru nebo při prvním pokusu o serializaci, což poskytuje včasnou detekci neplatných serializačních kontraktů.
Typ zásadní změny
Tato změna je změna chování.
Důvod změny
Tato změna poskytuje včasnou prevenci neplatných kontraktů serializace. Při průběžném ověření názvů vlastností serializátor zabraňuje situacím, kdy by se vygenerovaly duplicitní vlastnosti, což vede k neplatnému formátu JSON, který nelze správně zpracovat zpětně. To vývojářům pomáhá identifikovat a opravit problémy s konfigurací během vývoje, místo aby je během deserializace objevovali za běhu.
Další informace najdete tady:
- [STJ] Zakázat názvy vlastností, které jsou v konfliktu s názvy vlastností metadat (dotnet/runtime#106390)
- Zákaz typů s názvy vlastností v konfliktu s metadaty (dotnet/runtime#106460)
Doporučená akce
Nepoužívejte názvy vlastností, které jsou v konfliktu s vlastnostmi metadat specifických pro System.Text.Json (například $type, $ida $ref). Pokud je naprosto nezbytné zachovat takovou vlastnost ve třídě, použijte poznámku JsonIgnoreAttribute na konfliktní vlastnost.