使用JSON.NET对类型为接口的列表进行反序列化

本文关键字:列表 反序列化 接口 JSON NET 类型 使用 | 更新日期: 2023-09-27 17:49:21

我有一个"包装器"类,用于包含不同类型事件的列表。因此,列表本身使用一个通用的"AnEvent"接口,而不是一个具体的类型。

public class EventLog
{
    [JsonProperty()]
    private List<AnEvent> events;
    // note that the list is private and has no getter/setter
}

界面是这样的:

//public enum EventTypes { EventA, EventB };
public interface AnEvent
{
    EventTypes EventType
    {
        get;
        set;
    }
    // some other properties...
}

最后但并非最不重要的是,一个具体的事件类型可以像这样:

public class ConcreteEventA : AnEvent
{
    private EventTypes eventType = EventTypes.EventA;
    public EventTypes EventType
    {
        get { return eventType; }
        set { eventType = value; }
    }
     // ...
}

public class ConcreteEventB : Event
{
    // ....
}

正如你所看到的,关于事件类型的信息在这里有点多余(有类本身的类型,例如ConcreteEventA,并且在类中有一个名为EventType (enum)的属性)。

eventlog对象的序列化工作良好,并返回一个json事件列表。事件的类型表示为:"EventType": 0(即枚举中的"EventA")。

但是我有麻烦反序列化JSON回EventLog-instance("类型是一个接口或抽象类,不能被实例化")。当然,很明显,反序列化器无法确定列表中每个事件所需的类型。但是,由于我拥有由于EventType-property(在本例中为0或1)的类型的信息,我想知道如何使用该信息来正确地反序列化整个事情。

谢谢。

使用JSON.NET对类型为接口的列表进行反序列化

好吧,它不是JSON。使用System.Web.Script.Serialization.JavaScriptSerializer,你可以使用SimpleTypeResolver将你的派生类型映射到接口。

与JSON。这似乎可以通过IContractResolver来实现,它可以让您使用自定义行为来处理序列化和反序列化级别。

在序列化过程中,这两种方法似乎都需要在JSON中插入一些东西(比如一个指示类型的额外属性)。

JsonConverter可以在这方面提供帮助吗?但是您需要在进行序列化时输入类型名称。有关更多信息,请参阅问题using-json-net-converters-to-deserialize-properties