我有一个包含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<Person>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetPersons()
{
var persons = await _dbContext.Persons.ToListAsync();
return Ok(persons);
}
这与Entity Framework一起使用非常好,它返回学生和教授及其属性的集合。
我的Web应用程序正在调用此API。该Web项目具有视图模型,该视图模型与API中的实体模型基本相同。这是尝试调用API并反序列化结果的方法:
public async Task<IEnumerable<PersonViewModel>> GetPersons()
{
var data = await _apiClient.GetStringAsync(_personsUri);
var response = JsonConvert.DeserializeObject<IEnumerable<PersonViewModel>>(data);
return response;
}
问题是我无法反序列化我的视图模型,但出现了一个异常:
JsonSerializationException:无法创建类型为PersonViewModel的实例。类型是接口或抽象类,无法实例化。
如果我从PersonViewModel中删除abstract
,它将仅返回这些对象,并且不包含“学生”属性或“教授”属性。
还有其他方法可以做到吗?