首页 > 解决方案 > 将 JSON 对象发送到 C# WebAPI POST 方法,该方法将通用抽象类作为参数

问题描述

我有一个通用抽象类,它描述了某人将发布到此端点的对象类型,该类如下所示,以及该类可能是的类型示例:

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 对象的示例会是什么样子,或者是否有任何其他方法可以做到这一点?我在这里找到了一个线程,其中有人也有一个泛型类,这是他们被推荐的方法,所以尝试做同样的事情。

标签: c#json.netasp.net-coreasp.net-web-api

解决方案


如果您尝试用作输入参数

{
   "key":"pigEntity",
   "value":[
      1,
      2,
      3,
      4,
      5,
      6
   ]
}

你可以使用 JObject 但只能这样

public bool SaveAnimalSetting([FromBody] JObject animalType)
{
    var key = animalType["key"].ToString();

    switch (key)
    {
    case "pigEntity":

     var properties = JsonConvert.DeserializeObject<List<int>> (animalType["value"].ToString());
     var pig = new Pig { Properties = properties };
                    break;
        
                default:
                    break;
            }
}

我很抱歉,但这对我来说没有任何意义。因为每个类都应该有特殊的属性,所以在任何情况下你都应该知道在发送带有输入参数的 json 之前需要创建什么类型。只有当您想在一个请求中创建多个不同的类时,它才会有用。

问题是由于您需要反序列化数据,因此您需要知道用于反序列化的类型。也许您可以使用反射来创建类型,但与使用新的相比,它需要数百更多的时间和资源。我建议只有在没有反射就无法完成任务的情况下才使用反射。


推荐阅读