Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Dans certains contextes, tels que le polymorphisme et la conservation des références, System.Text.Json réserve des noms de propriétés spécifiques (par exemple, $type, $idet $ref) pour émettre des métadonnées. Certains noms de propriété tels que ceux-ci TypeDiscriminatorPropertyName peuvent également être configurés avec des noms personnalisés. Auparavant, le sérialiseur n’a pas effectué de validation sur la question de savoir si ces noms de propriétés étaient en conflit avec des contrats définis par l’utilisateur, ce qui pouvait entraîner des propriétés dupliquées et produire un JSON ambigu ou qui n’a pas pu aller-retour. À compter de .NET 10, System.Text.Json permet la validation pour empêcher ces configurations et fournit un avertissement précoce aux utilisateurs.
Version introduite
.NET 10
Comportement précédent
Auparavant, le code suivant produisait un objet JSON non valide avec des propriétés Type en double et il échouait à se désérialiser avec un 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";
}
Nouveau comportement
À compter de .NET 10, toute tentative de sérialisation de ce même type entraîne une erreur de validation anticipée :
InvalidOperationException : le type « Dog » contient la propriété « Type » qui est en conflit avec un nom de propriété de métadonnées existant. Envisagez de le renommer ou de l’ignorer avec JsonIgnoreAttribute.
Cette erreur de validation se produit lorsque le sérialiseur est créé pour la première fois ou lorsque la sérialisation est tentée pour la première fois, en fournissant une détection anticipée des contrats de sérialisation non valides.
Type de changement cassant
Ce changement est un changement de comportement.
Raison de la modification
Cette modification permet de prévenir rapidement les contrats de sérialisation non valides. En validant les noms de propriétés à l’avance, le sérialiseur empêche les scénarios où les propriétés dupliquées seraient émises, ce qui entraînerait un json non valide qui ne peut pas aller-retour correctement. Cela permet aux développeurs d’identifier et de résoudre les problèmes de configuration pendant le développement plutôt que de les découvrir au moment de la désérialisation.
Pour plus d’informations, consultez :
- [STJ] Interdire les noms de propriétés qui sont en conflit avec les noms de propriétés de métadonnées (dotnet/runtime#106390)
- Interdire les types avec des noms de propriétés en conflit avec les métadonnées (dotnet/runtime#106460)
Action recommandée
Évitez d’utiliser des noms de propriétés qui entrent en conflit avec les propriétés de métadonnées spécifiques à System.Text.Json (telles que $type, $idet $ref). S’il est absolument nécessaire de conserver une telle propriété dans la classe, appliquez une JsonIgnoreAttribute annotation à la propriété en conflit.