我有一个包含 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);
}
这与实体框架配合得很好,它返回学生和教授的集合及其属性。
我的 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 类型的实例。类型是接口或抽象类,无法实例化。
如果我删除abstract
从我的 PersonViewModel 中,它仅返回这些对象,并且不包含学生的属性或教授的属性。
我还有其他方法可以做到这一点吗?