从 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
案例.
这有捕获 所有 未列出的枚举值的额外好处,而不仅仅是您明确声明的值。
我总是向我的所有枚举添加一个 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
案例.
这有捕获 所有 未列出的枚举值的额外好处,而不仅仅是您明确声明的值。