使用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。使用System.Web.Script.Serialization.JavaScriptSerializer,你可以使用SimpleTypeResolver将你的派生类型映射到接口。
与JSON。这似乎可以通过IContractResolver来实现,它可以让您使用自定义行为来处理序列化和反序列化级别。
在序列化过程中,这两种方法似乎都需要在JSON中插入一些东西(比如一个指示类型的额外属性)。
JsonConverter
可以在这方面提供帮助吗?但是您需要在进行序列化时输入类型名称。有关更多信息,请参阅问题using-json-net-converters-to-deserialize-properties