c# - 具有多态对象数组的 JSON 反序列化

标签 c# json asp.net-mvc-3 json.net

我遇到了涉及多态对象数组的 JSON 反序列化问题。我已经尝试过记录的序列化解决方案 herehere这对序列化很有用,但都在反序列化时崩溃了。

我的类(class)结构如下:

可识别

[DataContract(IsReference=true)]
public abstract class IDable<T> {

    [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<int> {

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public List<Observation> Observations { get; set; }

    [OnDeserializing]
    void OnDeserializing(StreamingContext context)
    {
        init();
    }

    public ObservationGroup()  {
        init();
    }

    private void init()
    {
        Observations = new List<Observation>();
        ObservationRecords = new List<ObservationRecord>();
    }

}

描述性观察

[DataContract(IsReference = true)]
public class DescriptiveObservation : Observation
{

    protected override ObservationType GetObservationType()
    {
        return ObservationType.Descriptive;
    }
}

注意观察

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

数值观察

[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;
    }
}

评分观察

[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 类型的实例。类型是接口(interface)或抽象类,无法实例化。”

任何帮助将不胜感激!

最佳答案

您没有在反序列化时添加任何设置。您需要将 TypeNameHandling 设置为 ObjectAll 来应用设置。

像这样:

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

文档:TypeNameHandling setting

关于c# - 具有多态对象数组的 JSON 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7094955/

相关文章:

javascript - 如何将此 PHP 对象转换为数组?

c# - ASP.NET MVC 如何知道如何填充您的模型以提供 Controller 的操作?它涉及反射(reflection)吗?

javascript - Javascript 代码中的代码 Razor

c# - 你调用的对象是空的。在 wcf 服务中

c# - Razor View 基于一个字段的颜色行

jquery - 如何获取 JSON 列表中第 n 个项目的值(使用 JQuery)?

html - 如何在 asp.net MVC3 Razor 上编写 html 字段

c# - 如果某事是无效的,如何缩短

c# - 在 where 子句中浏览实体

javascript - 检查映射函数中的 JSON 响应中是否存在 key