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

.NET Minimal API如何让枚举默认序列化为字符串并适配Swagger?

.NET Minimal API枚举Swagger显示整数问题解决

我在使用.NET Minimal API开发时,已经通过ConfigureHttpJsonOptions全局配置了JSON序列化/反序列化采用字符串而非整数处理枚举,但Swashbuckle.AspNetCore生成的Swagger文档里,枚举仍以整数形式展示,请求示例如下:

{
  "name": "string",
  "type": 0
}

实际期望的请求示例是枚举字符串形式:

{
  "name": "string",
  "type": "Arithmetic"
}

原代码示例

using System.Text.Json.Serialization;

var builder = WebApplication.CreateBuilder(args);

// 全局配置JSON序列化使用字符串枚举
builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.Converters.Add(new JsonStringEnumConverter());
});

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.MapPost("/api/v1/test", (TestRequest request) => Results.Ok(request));

app.Run();

public enum GridType
{
    Arithmetic,
    Geometric
}

public class TestRequest
{
    public required string Name { get; init; }
    public required GridType Type { get; set; }
}

解决方法

问题核心:ConfigureHttpJsonOptions仅配置了ASP.NET Core自身的JSON处理逻辑,Swagger文档生成不会自动继承这个配置,需要单独对SwaggerGen进行枚举显示配置。

方案一:内置方法快速配置

修改AddSwaggerGen的配置,添加DescribeAllEnumsAsStrings(),让所有枚举在Swagger中以字符串形式展示:

builder.Services.AddSwaggerGen(options =>
{
    // 让所有枚举在Swagger文档中显示为字符串
    options.DescribeAllEnumsAsStrings();
});

方案二:自定义SchemaFilter(灵活控制)

如果需要更精细的枚举展示控制,可以自定义SchemaFilter:

  1. 实现ISchemaFilter接口:
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

public class StringEnumSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (context.Type.IsEnum)
        {
            // 将枚举类型标记为string
            schema.Type = "string";
            schema.Format = null;
            schema.Enum.Clear();
            
            // 添加所有枚举的字符串值到Swagger枚举列表
            foreach (var enumValue in Enum.GetValues(context.Type))
            {
                schema.Enum.Add(new OpenApiString(enumValue.ToString()));
            }
        }
    }
}
  1. 在SwaggerGen中注册该Filter:
builder.Services.AddSwaggerGen(options =>
{
    options.SchemaFilter<StringEnumSchemaFilter>();
});

效果验证

修改完成后重启项目,打开Swagger UI,请求示例中的枚举会显示为字符串形式,符合预期。

内容的提问来源于stack exchange,提问作者nop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:55:11