json.net (newtonsoft)
Je suis en train de parcourir la documentation mais je ne trouve rien sur ceci ou la meilleure façon de le faire.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
Maintenant, j'ai des objets dérivés dans la liste sérialisée. Comment désérialiser la liste et récupérer les types dérivés?
c#
json
serialization
json.net
Volonté
la source
la source
Réponses:
Si vous stockez le type dans votre
text
(comme vous devriez l'être dans ce scénario), vous pouvez utiliser leJsonSerializerSettings
.Voir: comment désérialiser JSON en IEnumerable <BaseType> avec Newtonsoft JSON.NET
Soyez prudent, cependant. Utiliser autre chose que
TypeNameHandling = TypeNameHandling.None
pourrait vous ouvrir à une faille de sécurité .la source
TypeNameHandling = TypeNameHandling.Auto
- cela ajoutera une$type
propriété UNIQUEMENT pour les instances où le type déclaré (ieBase
) ne correspond pas au type d'instance (ieDerived
). De cette façon, cela ne gonfle pas autant votre JSON queTypeNameHandling.All
.Vous devez activer la gestion du nom de type et le transmettre au (dé) sérialiseur en tant que paramètre de configuration.
Cela entraînera une désérialisation correcte des classes dérivées. Un inconvénient est qu'il nommera tous les objets que vous utilisez, en tant que tel, il nommera la liste dans laquelle vous placez les objets.
la source
TypeNameHandling.Auto
le fera aussi, et c'est plus agréable car il n'écrit pas le nom du type d'instance lorsqu'il correspond au type du champ / propriété, ce qui est souvent le cas pour la plupart des champs / propriétés.Étant donné que la question est si populaire, il peut être utile d'ajouter ce qu'il faut faire si vous souhaitez contrôler le nom de la propriété de type et sa valeur.
Le long chemin est d'écrire des
JsonConverter
s personnalisés pour gérer la (dé) sérialisation en vérifiant et en définissant manuellement la propriété type.Un moyen plus simple consiste à utiliser JsonSubTypes , qui gère tout le passe-partout via des attributs:
la source
Utilisez ce JsonKnownTypes , c'est une manière très similaire d'utiliser, il suffit d'ajouter un discriminateur à json:
Maintenant , lorsque vous sérialiser objet JSON sera ajouter
"$type"
avec"base"
et"derived"
valeur et il sera utilisé pour deserializeExemple de liste sérialisée:
la source