You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# API Controller中实现Swagger oneOf特性?

实现含oneOf的Swagger请求体的C# API Controller示例

针对Swashbuckle.AspNetCore.Newtonsoft 6.5.0版本,要生成包含oneOf的Swagger Schema,不能直接用dynamic或普通接口,需要结合基类+子类,并通过JsonSubtypes特性让Swagger识别多态类型。以下是完整示例:

1. 安装依赖包

确保已安装以下NuGet包:

  • Swashbuckle.AspNetCore.Newtonsoft 6.5.0
  • JsonSubtypes(用于处理JSON序列化的多态映射)

2. 定义多态实体类

using JsonSubtypes;
using Newtonsoft.Json;

[JsonConverter(typeof(JsonSubtypes), "AnimalType")]
[JsonSubtypes.KnownSubType(typeof(Cat), "Cat")]
[JsonSubtypes.KnownSubType(typeof(Dog), "Dog")]
[JsonSubtypes.KnownSubType(typeof(Hamster), "Hamster")]
public abstract class Animal
{
    public string AnimalType { get; set; }
    public string Name { get; set; }
}

public class Cat : Animal
{
    public int LivesRemaining { get; set; }
}

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

public class Hamster : Animal
{
    public int WheelSpeed { get; set; }
}
  • AnimalType字段作为类型判别符,Swagger会通过它识别具体子类
  • [JsonConverter]和[KnownSubType]特性告诉JSON序列化器和Swagger如何映射子类

3. 编写API Controller

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class AnimalsController : ControllerBase
{
    [HttpPost]
    public IActionResult AddAnimal([FromBody] Animal animal)
    {
        // 根据AnimalType处理不同类型的动物逻辑
        return Ok($"Received {animal.AnimalType}: {animal.Name}");
    }
}

直接用基类Animal作为请求体参数,Swagger会自动生成oneOf的Schema引用

4. 配置Swagger服务

在Program.cs(或Startup.cs)中配置Swagger,启用Newtonsoft支持并集成JsonSubtypes:

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Newtonsoft;

var builder = WebApplication.CreateBuilder(args);

// 添加控制器服务
builder.Services.AddControllers()
    .AddNewtonsoftJson(); // 启用Newtonsoft JSON序列化

// 配置Swagger
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "Animal API", Version = "v1" });
    // 启用Newtonsoft支持,确保Swagger识别JsonSubtypes的多态配置
    c.UseAllOfForInheritance();
    c.SelectSubTypesUsing(baseType => baseType.Assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t)));
});

var app = builder.Build();

// 启用Swagger中间件
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.Run();
  • UseAllOfForInheritance():让Swagger用allOf处理继承关系,配合oneOf实现多态请求体
  • SelectSubTypesUsing:确保Swagger能扫描到所有子类

最终Swagger效果

生成的Swagger请求体Schema会显示oneOf引用Cat、Dog、Hamster三个类型,并且会自动识别AnimalType作为判别字段,请求时只需传入对应类型的JSON即可。

内容的提问来源于stack exchange,提问作者Sergio Dalla Valle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:32:33