C# 序列化使用多态性的对象集合(基类)

C# 序列化使用多态性的对象集合(基类),c#,asp.net,json,inheritance,serialization,C#,Asp.net,Json,Inheritance,Serialization,我有一个示例控制器,当被调用时,它应该返回一个序列化对象,其中包含一个动物列表,其中所有属性都已显示。我面临的问题是,它只是序列化基类中的属性 型号 public class MyAnimals { public string Description { get; set; } public ICollection<Animal> Animals { get; set; } } public class Animal

我有一个示例控制器,当被调用时,它应该返回一个序列化对象,其中包含一个动物列表,其中所有属性都已显示。我面临的问题是,它只是序列化基类中的属性

型号

public class MyAnimals
    {
        public string Description { get; set; }

        public ICollection<Animal> Animals { get; set; }
    }

    public class Animal
    {
        public string Name { set; get; }
    }

    public class Dog: Animal
    {
        public string Says { get; set; } 
    }

    public class Cat : Animal
    {
        public string Likes { get; set; }
    }
之后所需的输出im应如下所示。请告诉我我做错了什么

所需响应

{
    "description": "My favorite animals",
    "animals": [
        {
            "name": "Tom"
        },
        {
            "name": "Pluto"
        }
    ]
}
{
    "description": "My favorite animals",
    "animals": [
        {
            "name": "Tom",
            "Likes": "Cheese"
        },
        {
            "name": "Pluto",
            "Says": "Bark"
        }
    ]
}

序列化是问题的第一部分,反序列化是第二部分。 Caleb George和JuanR为您指出了解决问题的好方向和方法


另一种方法是手动序列化每个动物,并将其以名称和值的形式传输到动物数组中。名称将是动物类型和值序列化对象…

对于.NET Core 3+项目,您需要安装

安装软件包Microsoft.AspNetCore.Mvc.NewtonsoftJson

并在启动时使用它

services.AddControllers().AddNewtonsoftJson();
这将使用JSON.NET作为默认序列化程序,您可以得到所需的响应

{
  "description": "My favorite animals",
  "animals": [
    {
      "likes": "Cheese",
      "name": "Tom"
    },
    {
      "says": "Bark",
      "name": "Pluto"
    }
  ]
}

请查看对一个类似问题的回答:什么库在这里执行JSON序列化?这是ASP.NET MVC 5?这应该是一个评论,而不是一个答案,特别是因为已经有一个了。
{
  "description": "My favorite animals",
  "animals": [
    {
      "likes": "Cheese",
      "name": "Tom"
    },
    {
      "says": "Bark",
      "name": "Pluto"
    }
  ]
}