A System.Text.Json metaadat-olvasó mostantól feloldja a metaadatok tulajdonságneveit

A System.Text.Json kódtár frissült a metaadattulajdonságok nevének karaktermegfejtésére. Ez a változás befolyásolja a JSON-dokumentumok értelmezését a hivatkozásmegőrzés, a polimorfizmus és a metaadattulajdonság-ellenőrzés kontextusában.

Bevezetett verzió

.NET 9

Előző viselkedés

Korábban System.Text.Json nem oldotta ki a metaadat-tulajdonságneveket. Ez érvénytelen tulajdonságnevek elfogadását eredményezheti, ami megkerülheti a metaadatok tulajdonságérvényesítését.

Az alábbi kód például sikeres lesz az első hívásban, de kivételt jelez a második hívásban:

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

record MyPoco;

A feloldó viselkedés polimorfizmusi problémákat is okozhat a metaadatok olyan tulajdonságainak kerekítésekor, amelyeknek a neve el kell menekülni, ahogy az itt látható:

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;

Új viselkedés

System.Text.Json mostantól feloldja a metaadatok tulajdonságneveit. Ez az új viselkedés azt jelenti, hogy a polimorf deszerializálási példában szereplő sor Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); most visszatér true, és az érvénytelen tulajdonságnevek helyesen nem deszerializálnak a következő kivétellel:

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

A kompatibilitástörő változás típusa

Ez a változás viselkedésbeli változás.

A változás oka

A módosítás javítja a helyességet és a megbízhatóságot azáltal, hogy biztosítja a metaadat-tulajdonságnevek megfelelő lefejezését, megakadályozva a metaadatok tulajdonságérvényesítésének megkerülését. További részletekért tekintse meg a jelentett problémát.

Kerülje a menekülést a metaadatok tulajdonságérvényesítésének megkerüléséhez. Ehelyett válasszon olyan tulajdonságneveket, amelyek nem ütköznek a metaadatok tulajdonságaival.

Érintett API-k