System.Text.Json söker efter egenskapsnamnkonflikter

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:

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.

Berörda API:er