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.
W niektórych kontekstach, takich jak polimorfizm i zachowywanie odwołań, System.Text.Json rezerwuje określone nazwy właściwości (na przykład $type, $idi $ref) do emitowania metadanych. Niektóre nazwy właściwości, takie jak TypeDiscriminatorPropertyName , można również skonfigurować z nazwami niestandardowymi. Wcześniej serializator nie wykonał walidacji, czy te nazwy właściwości były sprzeczne z kontraktami zdefiniowanymi przez użytkownika, co mogłoby spowodować zduplikowanie właściwości i wygenerowanie kodu JSON, który był niejednoznaczny lub nie powiódł się. Począwszy od platformy .NET 10, plik System.Text.Json umożliwia walidację, aby zapobiec takim konfiguracjom i zapewnia wczesne ostrzeżenie dla użytkowników.
Wersja wprowadzona
.NET 10
Poprzednie zachowanie
Wcześniej następujący kod wygenerował nieprawidłowy obiekt JSON z zduplikowanymi Type właściwościami i nie można wykonać deserializacji za pomocą polecenia 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";
}
Nowe zachowanie
Począwszy od platformy .NET 10, każda próba serializacji tego samego typu powoduje wystąpienie wczesnego błędu walidacji:
InvalidOperationException: typ "Dog" zawiera właściwość "Type", która powoduje konflikt z istniejącą nazwą właściwości metadanych. Rozważ zmianę nazwy lub zignorowanie jej za pomocą atrybutu JsonIgnoreAttribute.
Ten błąd weryfikacji występuje, gdy serializator jest tworzony po raz pierwszy lub podczas pierwszej próby serializacji, zapewniając wczesne wykrywanie nieprawidłowych kontraktów serializacji.
Typ zmiany przełamującej
Ta zmiana jest zmianą behawioralną.
Przyczyna zmiany
Ta zmiana zapewnia wczesne zapobieganie nieprawidłowym kontraktom serializacji. Walidując nazwy właściwości wcześniej, serializator zapobiega sytuacjom, w których emitowane byłyby zduplikowane właściwości, co skutkuje nieprawidłowym kodem JSON, który nie może być przetworzony poprawnie. Pomaga to deweloperom identyfikować i rozwiązywać problemy z konfiguracją podczas programowania, a nie odnajdywać ich w czasie wykonywania podczas deserializacji.
Aby uzyskać więcej informacji, zobacz:
- [STJ] Nie zezwalaj na nazwy właściwości, które powodują konflikt z nazwami właściwości metadanych (dotnet/runtime#106390)
- Nie zezwalaj na typy z nazwami właściwości powodującymi konflikt z metadanymi (dotnet/runtime#106460)
Zalecana akcja
Unikaj używania nazw właściwości, które powodują konflikt z właściwościami metadanych specyficznymi dla pliku System.Text.Json (takimi jak $type, $idi $ref). Jeśli jest to absolutnie konieczne, aby zachować taką właściwość w klasie, zastosuj adnotację JsonIgnoreAttribute do właściwości powodującej konflikt.