【发布时间】:2021-08-11 17:58:32
【问题描述】:
我有一个通用抽象类,它描述了某人将发布到此端点的对象类型,该类如下所示,以及该类可能是的类型示例:
public abstract class Animal<T>
{
public string Name { get; set; }
public virtual T Properties{ get; set; }
}
public class Pig : Animal<List<int>>
{
public Pig()
{
Name = "pigEntity";
Properties = new List<int>();
}
}
下面是我的控制器方法调用 API 端点的样子:
[HttpPost]
[Route("...")]
public async Task<bool> SaveAnimalSetting([FromBody] Animal<JObject> animalType)
{}
当尝试通过 Postman 调用此端点时,我返回输入无效,下面是我尝试向其发布的 JSON 对象,它应该与上面的 Pig 对象等效:
{
"key":"pigEntity",
"value":[
1,
2,
3,
4,
5,
6
]
}
有谁知道我哪里出错了,或者当使用通用抽象类作为参数调用端点时,JSON 对象的示例会是什么样子,或者是否有其他方法可以做到这一点?我在这里找到了一个线程,其中有人也有一个泛型类,这是他们被推荐的方法,因此尝试做同样的事情。
【问题讨论】:
-
您基本上是在要求反序列化器创建抽象类的实例,这是不可能的。除非您有某处代码告诉框架如何将输入反序列化为正确的派生类,否则这根本行不通。具体来说,如果您想采用这种方法,则必须使用反序列化框架。
-
你不能轻易做到这一点。您将需要指定端点中预期的实际类型。像 [FromBody Animal
anymalType].... 此外,您不应该使用抽象类或接口。 -
您可能会使用自定义转换器并使用包装器和显式类型并从属性返回对象。
-
@JonathanAlfaro 是的,他需要为(我假设)System.Json JSON 序列化程序编写自定义转换器
-
有没有办法让它与端点中的基类(在这种情况下为动物)一起工作?因为那是我之后的主要事情。之后我的计划是根据 JSON 中的“关键”属性,直接使用 switch case 将该对象转换为其正确的派生类。目前没有实现这个,因为不能让它首先工作,所以暂时使用常规的 JObject 参数
标签: c# json .net asp.net-core asp.net-web-api