Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I vissa sammanhang, som polymorfism och referensbevarande, reserverar System.Text.Json specifika egenskapsnamn (till exempel $type, $id och $ref) för att generera metadata. Vissa egenskapsnamn, till exempel TypeDiscriminatorPropertyName , kan också konfigureras med anpassade namn. Tidigare utförde serialiseraren inte validering av om dessa egenskapsnamn stod i konflikt med användardefinierade kontrakt, vilket kan resultera i duplicerade egenskaper och skapa JSON som var tvetydig eller inte kunde avrundas. Från och med .NET 10 aktiverar System.Text.Json verifiering för att förhindra sådana konfigurationer och ger tidig varning till användare.
Version lanserad
.NET 10
Tidigare beteende
Tidigare skapade följande kod ett ogiltigt JSON-objekt med duplicerade Type egenskaper och kunde inte deserialisera med ett JsonException:
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";
}
Nytt beteende
Från och med .NET 10 resulterar alla försök att serialisera samma typ i ett tidigt valideringsfel:
InvalidOperationException: Typen "Dog" innehåller egenskapen "Type" som står i konflikt med ett befintligt namn på metadataegenskapen. Överväg att antingen byta namn på den eller ignorera den med JsonIgnoreAttribute.
Det här valideringsfelet uppstår när serialiseraren först skapas eller när serialiseringen först görs, vilket ger tidig identifiering av ogiltiga serialiseringskontrakt.
Typ av brytande ändring
Den här ändringen är en beteendeförändring.
Orsak till ändring
Den här ändringen ger tidigt skydd mot ogiltiga serialiseringskontrakt. Genom att verifiera egenskapsnamn i förväg förhindrar serialiseraren scenarier där duplicerade egenskaper genereras, vilket resulterar i ogiltig JSON som inte kan avrundas korrekt. Detta hjälper utvecklare att identifiera och åtgärda konfigurationsproblem under utvecklingen i stället för att upptäcka dem vid deserialisering under körning.
Mer information finns i:
- [STJ] Tillåt inte egenskapsnamn som är i konflikt med metadataegenskapsnamn (dotnet/runtime#106390)
- Tillåt inte typer med egenskapsnamn som är i konflikt med metadata (dotnet/runtime#106460)
Rekommenderad åtgärd
Undvik att använda egenskapsnamn som är i konflikt med System.Text.Json-specifika metadataegenskaper (till exempel $type, $idoch $ref). Om det är absolut nödvändigt att behålla en sådan egenskap i klassen ska du tillämpa en JsonIgnoreAttribute anteckning på den motstridiga egenskapen.