Désérialiser une liste avec newtonsoft.json

J’essaie de sérialiser et de désérialiser une liste de classes abstract ( mustinherit for vb). À l’intérieur, il n’y a évidemment que des occurrences de classes dérivées.

J’ai décoré le paramètre list avec le JsonProperty(ItemTypeNameHandling = TypeNameHandling.Auto) obtenant une sortie ressemblant à ceci:

Mais quand je le désérialise, continuez à dire qu’il ne peut pas désérialiser une classe abstraite.

http://james.newtonking.com/json/help/index.html?topic=html/SerializeTypeNameHandling.htm

 public class ConcreteClass { private ObservableCollection _Nodes = new ObservableCollection(); // public ObservableCollection Nodes { get { return this._Nodes; } } public ssortingng Name { get; set; } public int Id { get; set; } } public abstract class AbstractClass { private ObservableCollection _Nodes = new ObservableCollection(); [Newtonsoft.Json.JsonProperty(itemtypenamehandling = Newtonsoft.Json.TypeNameHandling.Auto)] public ObservableCollection Nodes { get { return this._Nodes; } } } 

enlever la ligne commentée ça marche!

Assurez-vous de spécifier TypeNameHandling lors de la désérialisation, conformément à la documentation:

 // for security TypeNameHandling is required when deserializing Stockholder newStockholder = JsonConvert.DeserializeObject(jsonTypeNameAuto, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }); 

Il est à noter que la documentation désérialise une classe Concrete contenant une collection de classes abstraites.

En guise d’expérience, essayez de créer une classe jetable (concrète) possédant une propriété unique avec votre liste d’objects abstraits et voyez si vous pouvez sérialiser et désérialiser cette propriété.

METTRE À JOUR:

Je viens de tester le code suivant dans LINQPad:

 void Main() { var test = new List(); test.Add(new Hotel { Name = "Hilton", Stars = 5 }); test.Add(new Pool { Name = "Big Splash", Capacity = 500 }); test.Dump(); ssortingng json = JsonConvert.SerializeObject(test, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }); json.Dump(); var businesses = JsonConvert.DeserializeObject>(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }); businesses.Dump(); } // Define other methods and classes here public abstract class Business { public ssortingng Name { get;set; } } public class Hotel : Business { public int Stars { get;set; } } public class Pool : Business { public int Capacity { get;set;} } 

Cela a fonctionné parfaitement. Collection abstraite numérotée à:

 { "$type": "System.Collections.Generic.List`1[[UserQuery+Business, query_jvrdcu]], mscorlib", "$values": [ { "$type": "UserQuery+Hotel, query_jvrdcu", "Stars": 5, "Name": "Hilton" }, { "$type": "UserQuery+Pool, query_jvrdcu", "Capacity": 500, "Name": "Big Splash" } ] } 

Les collections originales et désérialisées correspondaient.