JSON使用多态对象数组进行反序列化
我遇到了涉及多态对象数组的JSON反序列化问题。 我已经尝试了这里和这里记录的序列化解决方案,这些解决方案非常适合序列化,但是它们都在反序列化方面有所作为。
我的class级结构如下:
IDable
[DataContract(IsReference=true)] public abstract class IDable { [DataMember] public T ID { get; set; } }
观察组
[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; } }
我使用内置的JavaScriptSerializer或Newtonsoft JSON库是公正的。
序列化代码
var settings = new Newtonsoft.Json.JsonSerializerSettings(); settings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects; Newtonsoft.Json.JsonConvert.SerializeObject(AnInitializedScoresheet, Newtonsoft.Json.Formatting.None, settings);
反序列化代码
return Newtonsoft.Json.JsonConvert.DeserializeObject(returnedStringFromClient, typeof(Scoresheet)); //Scoresheet contains a list of observationgroups
我得到的错误是
“无法创建ProjectXCommon.DataStores.Observation类型的实例.Type是一个接口或抽象类,无法立即显示。”
任何帮助将非常感激!
您没有在反序列化时添加任何设置。 您需要将TypeNameHandling
设置为Object
或All
来应用设置。
像这样:
JsonConvert.DeserializeObject( returnedStringFromClient, typeof(Scoresheet), new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects });
文档: TypeNameHandling设置
上述就是C#学习教程:JSON使用多态对象数组进行反序列化分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/988410.html