【问题标题】:Exclude specific Enum values from Swagger从 Swagger 中排除特定的枚举值
【发布时间】:2019-02-28 19:47:14
【问题描述】:

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

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

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

我尝试将[JsonIgnore] 属性添加到该值,但没有奏效。

有人知道怎么做吗?

【问题讨论】:

  • 你是在使用 Swachbuckle 生成 Swagger 页面吗?
  • @ysabih 是的。我正在使用 Swashbuckle.AspNetCore v4.0.2
  • Swashbuckle 不支持隐藏枚举成员,你必须将枚举封装在一个类中然后使用[JsonIngore],这里有详细的答案stackoverflow.com/a/52310219/7248501

标签: c# .net enums swagger swashbuckle


【解决方案1】:

以防万一其他人为此苦苦挣扎。您可以创建自定义 SchemaFilter 并使用自定义属性(在此示例中:OpenApiIgnoreEnumAttribute)对这些枚举值填充 Enum 属性过滤。

    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,
    }

【讨论】:

    【解决方案2】:

    您可以使用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

    【讨论】:

      【解决方案3】:

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

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

      只要定义的值不等于default(int),或者您选择的枚举类型的默认值,您仍然可以按预期使用枚举,并使用switch default 情况捕获未初始化的值。

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

      【讨论】:

      • 虽然这并不能直接回答我的问题,但它实际上更进一步,因为它解释了我的想法中的缺陷,导致我首先提出了这个问题。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 2018-11-05
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多