Json.net sérialiser/désérialiser les types dérivés?
json.net (newtonsoft)
Je suis à la recherche par le biais de la documentation mais je ne trouve rien sur ce 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 le sérialisé liste. Comment puis-je désérialiser la liste et d'obtenir en retour les types dérivés?
- Ce n'est pas la façon dont l'héritage fonctionne. Vous pouvez spécifier JsonConvert.Désérialiser<Dérivés>(texte); pour inclure le Nom de domaine. Depuis Dérivée de EST UNE de Base (pas l'inverse), la Base ne sait rien à propos de la Dérivée de la définition.
- Désolé, de clarifier un peu. Le problème est que j'ai une liste qui contient à la fois de base et des objets dérivés. J'ai donc besoin de comprendre comment je dire newtonsoft comment désérialiser les dérivées des éléments.
- Je ne vous résoudre ce problème. J'ai le même problème
Vous devez vous connecter pour publier un commentaire.
Si vous stockez le type de votre
text
(comme vous devriez être dans ce cas), vous pouvez utiliser leJsonSerializerSettings
.Voir: comment désérialiser JSON dans IEnumerable<BaseType> avec Newtonsoft JSON.NET
Être prudent, cependant. En utilisant rien d'autre que
TypeNameHandling = TypeNameHandling.None
pourrait vous ouvrir à de une vulnérabilité de sécurité.TypeNameHandling = TypeNameHandling.Auto
- cela va ajouter une$type
propriété UNIQUEMENT pour les cas où le type déclaré (c'est à direBase
) ne correspond pas au type d'instance (c'est à direDerived
). De cette façon, il n'a pas de gonfler votre JSON autant queTypeNameHandling.All
.Vous devez activer le Type de la gestion des noms et passer à l' (de)sérialiseur en tant que paramètres paramètre.
Le résultat sera correct de la désérialisation des classes dérivées. Un inconvénient c'est qu'il va nommer tous les objets que vous utilisez, comme telle, elle portera le nom de la liste vous de mettre les objets en.
TypeNameHandling.Auto
va le faire aussi, et est plus agréable parce qu'il n'écrit pas l'exemple type de nom lorsqu'elle correspond au type du champ de la propriété, ce qui est souvent le cas pour la plupart des champs/propriétés.Depuis que la question est si populaire, il peut être utile d'ajouter sur ce que vous devez faire si vous voulez contrôler le type de nom de la propriété et sa valeur.
Le chemin le plus long est d'écrire personnalisé
JsonConverter
s à la poignée de la (dé)sérialisation en vérifiant manuellement et définition de la propriété type.Une façon plus simple est d'utiliser JsonSubTypes, qui hanldes tous les passe-partout grâce à des attributs: