.NET 6中如何在属性级别配置Swagger显示枚举为字符串?
针对Swagger UI细粒度显示枚举属性为字符串的解决方案
你在.NET 6项目中使用System.Text.Json和Swashbuckle v6.5.0,希望仅对单个枚举属性设置Swagger UI显示字符串而非整数,不想用全局配置或枚举类上加特性的方式,目前尝试在属性上加[JsonConverter(typeof(JsonStringEnumConverter))]但Swagger UI不生效,除了官方修复外,你可以通过自定义Swagger过滤器来实现需求:
自定义Schema过滤器实现属性级控制
通过实现ISchemaFilter接口,我们可以手动修改带有指定特性的枚举属性的Swagger Schema,让它显示字符串值而非整数:
- 创建自定义过滤器类:
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Reflection; using System.Text.Json.Serialization; public class JsonStringEnumPropertyFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (context.MemberInfo is PropertyInfo propertyInfo) { // 检查当前属性是否标记了JsonStringEnumConverter特性 var converterAttr = propertyInfo.GetCustomAttribute<JsonConverterAttribute>(); if (converterAttr != null && converterAttr.ConverterType == typeof(JsonStringEnumConverter)) { var enumType = Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType; if (enumType.IsEnum) { // 修改Schema类型为字符串 schema.Type = "string"; schema.Format = null; // 替换枚举值为字符串名称 schema.Enum.Clear(); foreach (var enumValue in Enum.GetValues(enumType)) { schema.Enum.Add(new OpenApiString(Enum.GetName(enumType, enumValue))); } } } } } }
- 在Program.cs中注册这个过滤器:
builder.Services.AddSwaggerGen(c => { c.SchemaFilter<JsonStringEnumPropertyFilter>(); // 保留你原有的Swagger配置 });
效果验证
完成配置后,启动项目打开Swagger UI,你会看到Address记录中标记了[JsonConverter(typeof(JsonStringEnumConverter))]的AddressType属性,会显示对应的枚举字符串选项(比如Home、Work这类值),而其他未标记的枚举属性依然保持整数显示,完美实现细粒度控制。
内容的提问来源于stack exchange,提问作者KenR
相关产品推荐
相关产品推荐

