JSON Deserializzazione con una serie di oggetti polimorfici

Sto riscontrando un problema con la deserializzazione JSON che coinvolge una serie di oggetti polimorfici. Ho provato le soluzioni per la serializzazione documentate qui e qui che funzionano molto bene per la serializzazione, ma entrambe fanno esplodere la deserializzazione.

La mia struttura di class è la seguente:

IDable

[DataContract(IsReference=true)] public abstract class IDable { [DataMember] public T ID { get; set; } } 

Gruppo di osservazione

 [DataContract(IsReference=true)] [KnownType(typeof(DescriptiveObservation))] [KnownType(typeof(NoteObservation))] [KnownType(typeof(NumericObservation))] [KnownType(typeof(ScoredObservation))] public class ObservationGroup : IDable { [DataMember] public string Title { get; set; } [DataMember] public List Observations { get; set; } [OnDeserializing] void OnDeserializing(StreamingContext context) { init(); } public ObservationGroup() { init(); } private void init() { Observations = new List(); ObservationRecords = new List(); } } 

DescriptiveObservation

 [DataContract(IsReference = true)] public class DescriptiveObservation : Observation { protected override ObservationType GetObservationType() { return ObservationType.Descriptive; } } 

NoteObservation

 [DataContract(IsReference = true)] public class NoteObservation : Observation { protected override ObservationType GetObservationType() { return ObservationType.Note; } } 

NumericObservation

 [DataContract(IsReference = true)] public class NumericObservation : Observation { [DataMember] public double ConstraintMaximum { get; set; } [DataMember] public double ConstraintMinimum { get; set; } [DataMember] public int PrecisionMaximum { get; set; } [DataMember] public int PrecisionMinimum { get; set; } [DataMember] public string UnitType { get; set; } protected override ObservationType GetObservationType() { return ObservationType.Numeric; } } 

ScoredObservation

 [DataContract(IsReference = true)] public class ScoredObservation : Observation { [DataMember] public int Value { get; set; } protected override ObservationType GetObservationType() { return ObservationType.Scored; } } 

Sono imparziale nell’usare JavaScriptSerializer o la libreria JSON Newtonsoft.

Codice di serializzazione

 var settings = new Newtonsoft.Json.JsonSerializerSettings(); settings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects; Newtonsoft.Json.JsonConvert.SerializeObject(AnInitializedScoresheet, Newtonsoft.Json.Formatting.None, settings); 

Codice di deserializzazione

 return Newtonsoft.Json.JsonConvert.DeserializeObject(returnedStringFromClient, typeof(Scoresheet)); //Scoresheet contains a list of observationgroups 

L’errore che ottengo è

“Imansible creare un’istanza di tipo ProjectXCommon.DataStores.Observation. Type è un’interfaccia o una class astratta e non può essere istanziata.”

Qualsiasi aiuto sarebbe molto apprezzato!

Non hai aggiunto impostazioni sulla deserializzazione. È necessario applicare le impostazioni con TypeNameHandling impostato su Object o All .

Come questo:

 JsonConvert.DeserializeObject( returnedStringFromClient, typeof(Scoresheet), new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects }); 

Documentazione: TypeNameHandling setting