Sdílet prostřednictvím


System.Text.Json kontroluje konflikty názvů vlastností.

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:

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.

Ovlivněná rozhraní API