.NET 6中Swagger如何将枚举显示为字符串?
.NET 6中让Swagger枚举以字符串形式展示的解决方法
方法一:通过SwaggerGen直接配置枚举Schema
在配置SwaggerGen时,直接指定枚举类型的Schema为字符串格式,覆盖默认的整数展示逻辑:
builder.Services.AddSwaggerGen(options => { // 全局配置所有枚举以字符串展示 options.MapType<Enum>(() => new OpenApiSchema { Type = "string", Enum = Enum.GetValues(typeof(Enum)) .Cast<Enum>() .Select(e => new OpenApiString(e.ToString())) .ToList<IOpenApiAny>() }); // 若只需针对特定枚举配置,替换为以下代码 // options.MapType<YourTargetEnum>(() => new OpenApiSchema // { // Type = "string", // Enum = Enum.GetValues(typeof(YourTargetEnum)) // .Cast<YourTargetEnum>() // .Select(e => new OpenApiString(e.ToString())) // .ToList<IOpenApiAny>() // }); });
方法二:结合Json序列化配置与Swagger Schema过滤器
仅添加JsonStringEnumConverter只会影响接口的序列化逻辑,不会同步修改Swagger文档的展示,需配合Schema过滤器实现文档层面的字符串枚举展示:
- 先配置Json序列化:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); });
- 创建自定义Schema过滤器:
public class EnumSchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (context.Type.IsEnum) { schema.Type = "string"; schema.Enum.Clear(); Enum.GetNames(context.Type) .ToList() .ForEach(name => schema.Enum.Add(new OpenApiString(name))); } } }
- 在SwaggerGen中注册过滤器:
builder.Services.AddSwaggerGen(options => { options.SchemaFilter<EnumSchemaFilter>(); });
方法三:特性标记单个枚举
如果仅需特定枚举以字符串展示,可直接给枚举类添加序列化特性,再配合上述Swagger配置即可生效:
[JsonConverter(typeof(JsonStringEnumConverter))] public enum YourBusinessEnum { OrderPending, OrderPaid, OrderCompleted }
内容的提问来源于stack exchange,提问作者Tenio Hristov
相关产品推荐
相关产品推荐

