Udostępnij przez


Czytnik metadanych System.Text.Json teraz odkodowuje nazwy właściwości metadanych.

Biblioteka System.Text.Json została zaktualizowana, aby odsłonić nazwy właściwości metadanych. Ta zmiana wpływa na sposób interpretowania dokumentów JSON w kontekście zachowywania odwołań, polimorfizmu i walidacji właściwości metadanych.

Wersja wprowadzona

.NET 9

Poprzednie zachowanie

System.Text.Json Wcześniej nazwy właściwości metadanych nie były niedostępne. Doprowadziłoby to do zaakceptowania nieprawidłowych nazw właściwości, co mogłoby pominąć walidację właściwości metadanych.

Na przykład następujący kod powiedzie się w pierwszym wywołaniu, ale zgłosi wyjątek w drugim wywołaniu:

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

record MyPoco;

Zachowanie dotyczące niepoprawnego użycia znaków ucieczki może również powodować problemy z polimorfizmem podczas wielokrotnego przetwarzania właściwości metadanych, których nazwy wymagają użycia znaków ucieczki, jak pokazano tutaj:

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;

Nowe zachowanie

System.Text.Json teraz usuwa znaki ucieczki z nazw właściwości metadanych. To nowe zachowanie oznacza, że wiersz Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); z przykładu deserializacji polimorficznej zwraca teraz wartość true, a nieprawidłowe nazwy właściwości poprawnie nie mogą wykonać deserializacji z następującym wyjątkiem:

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

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Zmiana poprawia poprawność i niezawodność, zapewniając, że nazwy właściwości metadanych są prawidłowo rozpakowane, co uniemożliwia obejście weryfikacji właściwości metadanych. Aby uzyskać więcej informacji, zobacz zgłoszony problem.

Unikaj używania ucieczki w celu obejścia weryfikacji właściwości metadanych. Zamiast tego wybierz nazwy właściwości, które nie powodują konfliktu z właściwościami metadanych.

Interfejsy API, których dotyczy problem