如何使用 OpenAPI/Swagger 在 .net5 上运行的 Function App 中将枚举序列化为字符串?

Kzr*_*tof 9 c# swagger azure-functions .net-5 system.text.json

我正在探索.net5在新的隔离模式下运行的功能应用程序。我有 HTTP 触发的函数,我想通过 OpenAPI / Swagger 进行宣传。

为此,我使用预览版 (0.7.2)Microsoft.Azure.WebJobs.Extensions.OpenApi中的包将 OpenAPI 功能添加到我的 Function App。

我试图让其enums显示string在 OpenAPI 页面中,但我无法让它正常工作。

这是文件中的设置Program.cs

    public static class Program
    {
        private static Task Main(string[] args)
        {
            IHost host = new HostBuilder()
                .ConfigureAppConfiguration(configurationBuilder =>
                {
                    configurationBuilder.AddCommandLine(args);
                })
                .ConfigureFunctionsWorkerDefaults(builder =>
                {
                    builder.Services.Configure<JsonSerializerOptions>(options =>
                    {
                        options.Converters.Add(new JsonStringEnumConverter());
                        options.PropertyNameCaseInsensitive = true;
                    });
                })
                .ConfigureServices(services =>
                {
                    //  Registers any services.             
                })
                .Build();

            return host.RunAsync();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是枚举:

    [JsonConverter(typeof(JsonStringEnumConverter))]
    public enum ApprovalContract
    {
        [EnumMember(Value = "Approved")]
        Approved = 1,

        [EnumMember(Value = "Rejected")]
        Rejected = 2
    }
Run Code Online (Sandbox Code Playgroud)

以及使用它的类之一:

    public sealed class DeletionResponseContract
    {
        [JsonPropertyName("approval")]
        public ApprovalContract Approval { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我到处都替换了对的任何Newtonsoft.Json引用System.Text.Json

以下是 Swagger 页面中的输出:

Swagger 页面中的枚举

问题

如何使用 HTTP 触发的 Azure Functions 序列enum化为string而不是int在 Swagger 页面中运行.net5

更新

我看到 的JsonStringEnumConverter构造函数给出了允许整数值的指示:

     public JsonStringEnumConverter(JsonNamingPolicy? namingPolicy = null, bool allowIntegerValues = true)
    {
      this._namingPolicy = namingPolicy;
      this._converterOptions = allowIntegerValues ? EnumConverterOptions.AllowStrings | EnumConverterOptions.AllowNumbers : EnumConverterOptions.AllowStrings;
    }
Run Code Online (Sandbox Code Playgroud)

我像这样修改了我的配置,但没有成功:

builder.Services.Configure<JsonSerializerOptions>(options =>
{
     options.Converters.Add(new JsonStringEnumConverter(allowIntegerValues: false));
     options.PropertyNameCaseInsensitive = true;
});
Run Code Online (Sandbox Code Playgroud)

Mur*_*rti 0

您必须实现 ISchemaFilter 并将其设置在 AddSwaggerGen 上。它将为您的枚举项目生成更好的描述。

builder.Services.AddSwaggerGen(c =>
{
    c.SchemaFilter<EnumSchemaFilter>();
});


//your implementation
public class EnumSchemaFilter : ISchemaFilter
    {
        public void Apply(OpenApiSchema model, SchemaFilterContext context)
        {
            if (context.Type.IsEnum)
            {
                model.Enum.Clear();
                Enum.GetNames(context.Type)
                    .ToList()
                    .ForEach(name => model.Enum.Add(new OpenApiString($"{Convert.ToInt64(Enum.Parse(context.Type, name))} - {name}")));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)