Dela via


System.Text.Json-metadataläsaren avkodar nu metadatans egenskapsnamn

Biblioteket System.Text.Json har uppdaterats för att avkoda metadataegenskapnamn. Den här ändringen påverkar hur JSON-dokument tolkas i samband med validering av referensbevarande, polymorfism och metadataegenskap.

Version lanserad

.NET 9

Tidigare beteende

System.Text.Json Tidigare tog inte bort namn på metadataegenskap. Detta skulle leda till att ogiltiga egenskapsnamn accepteras, vilket kan kringgå validering av metadataegenskap.

Följande kod skulle till exempel lyckas i det första anropet men utlöser ett undantag i det andra anropet:

JsonSerializerOptions options = new() { ReferenceHandler = ReferenceHandler.Preserve };
JsonSerializer.Deserialize<MyPoco>("""{"\u0024invalid" : 42 }""", options);
JsonSerializer.Deserialize<MyPoco>("""{"$invalid" : 42 }""", options);

record MyPoco;

Det ofrånkomliga beteendet kan också orsaka polymorfismproblem vid avrundning av metadataegenskaper vars namn kräver att de flyr, som du ser här:

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;

Nytt beteende

System.Text.Json avkodas nu metadataegenskapsnamn. Det här nya beteendet innebär att raden Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); från det polymorfa deserialiseringsexemplet nu returnerar true, och att ogiltiga egenskapsnamn korrekt inte kan deserialisera med följande undantag:

Unhandled exception. System.Text.Json.JsonException: Properties that start with '$' are not allowed in types that support metadata.

Typ av brytande ändring

Den här ändringen är en beteendeförändring.

Orsak till ändring

Ändringen förbättrar korrektheten och tillförlitligheten genom att se till att namn på metadataegenskaperna är korrekt avkapslade, vilket förhindrar kringgående av validering av metadataegenskaper. Mer information finns i det rapporterade problemet.

Undvik att använda escapeing för att kringgå validering av metadataegenskap. Välj i stället egenskapsnamn som inte är i konflikt med metadataegenskaper.

Berörda API:er