反序列化抽象类的集合
反序列化抽象类的集合
我有一个包含Web API和MVC Web应用程序的解决方案。
我的API有一个实体模型,其中包含一个抽象的父类和几个子类:
public abstract class Person { public Guid Id { get; set; } public string Name { get; set; } } public class Student : Person { public Address Dormitory { get; set; } ... additional fields } public class Professor : Person { public Schedule OfficeHours { get; set; } ... additional fields }
我有一个用于获取所有人员的终端点:
[HttpGet] [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] public async Task GetPersons() { var persons = await _dbContext.Persons.ToListAsync(); return Ok(persons); }
这在Entity Framework中运行良好,它返回了一个包含学生和教授及其属性的集合。
我的Web应用程序调用这个API。Web项目有视图模型,在API中与实体模型基本相同。以下是试图调用API并反序列化结果的方法:
public async Task> GetPersons() { var data = await _apiClient.GetStringAsync(_personsUri); var response = JsonConvert.DeserializeObject >(data); return response; }
问题是我无法反序列化到我的视图模型,我收到一个异常,说:
JsonSerializationException: 无法创建类型PersonViewModel的实例。该类型是一个接口或抽象类,无法实例化。
如果我从PersonViewModel中删除abstract
,它只返回那些对象,并且不包含学生或教授的属性。
有其他方法可以做到这一点吗?