从 Swagger 中排除特定的枚举值

Exclude specific Enum values from Swagger

我总是向我的所有枚举添加一个 Uninitialized 值并将其设置为 0 以处理我反序列化具有从未设置的枚举 属性 值的对象的情况.

enum MyEnum
{
    Uninitialized = 0,
    MyEnumValue1 = 1,
    MyEnumValue2 = 2,
    MyEnumValue3 = 3,
}

但是,我不希望 Uninitialized 值出现在我的 Swagger 文档中。

我试过将 [JsonIgnore] 属性添加到该值,但没有成功。

有人知道如何完成这个吗?

您可以使用 IDocumentFilter 从规范中删除任何您想要的内容。

一开始可能不直观,看看他们的一些例子: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/search?q=IDocumentFilter

有了它,您就可以更改 swagger json 规范以删除或注入任何您想要的东西。
现在小心你可能会得到一个不合规的规范,总是对照验证器检查它:https://validator.swagger.io/validator/debug?url=http://swagger-net-test.azurewebsites.net/swagger/docs/V1

以防其他人遇到这个问题。您可以创建自定义 SchemaFilter 并使用自定义属性填充 Enum 属性 对这些枚举值的过滤(在此示例中:OpenApiIgnoreEnumAttribute)。

    public class OpenApiIgnoreEnumSchemaFilter : ISchemaFilter
    {
        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
        {
            if (context.Type.IsEnum)
            {
                var enumOpenApiStrings = new List<IOpenApiAny>();

                foreach (var enumValue in Enum.GetValues(context.Type))
                {
                    var member = context.Type.GetMember(enumValue.ToString())[0];
                    if (!member.GetCustomAttributes<OpenApiIgnoreEnumAttribute>().Any())
                    {
                        enumOpenApiStrings.Add(new OpenApiString(enumValue.ToString()));
                    }
                }

                schema.Enum = enumOpenApiStrings;
            }
        }
    }
    public class OpenApiIgnoreEnumAttribute : Attribute
    {
    }
    public enum ApplicationRole
    {
        [OpenApiIgnoreEnum]        
        DoNotExpose = 1,        
        ValueA = 2,        
        ValueB = 3,
    }

您可以简单地省略 Uninitialized 枚举值来解决这个问题。

枚举实际上可以包含您明确定义的值以外的值。我可以做到 var myEnumValue = (MyEnum)12345;,它不会中断或抛出异常,但它也不会匹配任何显式定义的枚举值。

只要定义的值不等于 default(int),或者您选择的枚举类型的默认值,您仍然可以按预期使用枚举,并使用 switch default案例.

这有捕获 所有 未列出的枚举值的额外好处,而不仅仅是您明确声明的值。