Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Zalecana akcja
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.