反序列化抽象类的集合

时间:2018-10-15 02:08:21

标签: c# .net json asp.net-core json.net

我有一个包含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,它将仅返回这些对象,并且不包含“学生”属性或“教授”属性。

还有其他方法可以做到吗?

0 个答案:

没有答案