如何在最小 API 端点和 Swagger 中将枚举序列化默认为字符串?

nop*_*nop 3 c# swagger swashbuckle asp.net-core minimal-apis

我正在使用 .NET 最小 API,并且遇到了枚举的 JSON 序列化/反序列化行为的问题。尽管我尝试更改使用字符串而不是整数的行为,但 Swashbuckle.AspNetCore 的 Swagger 文档仍然将枚举表示为整数。

using System.Text.Json.Serialization;

var builder = WebApplication.CreateBuilder(args);

// Docs: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-7.0#configure-json-deserialization-options-globally
builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.Converters.Add(new JsonStringEnumConverter());
});

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.MapPost("/api/v1/test", (TestRequest request) => Results.Ok(request));

app.Run();

public enum GridType
{
    Arithmetic,
    Geometric
}

public class TestRequest
{
    public required string Name { get; init; }
    public required GridType Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是当 Swagger UI 打开时,我仍然得到枚举的整数:

{
  "name": "string",
  "type": 0
}
Run Code Online (Sandbox Code Playgroud)

预期输出是:

{
  "name": "string",
  "type": "Arithmetic"
}
Run Code Online (Sandbox Code Playgroud)

Sha*_*ami 12

MinimalApi 和 Swashbuckle Swagger 之间存在问题,您必须在两个不同的位置设置该选项:

builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
builder.Services.Configure<Microsoft.AspNetCore.Mvc.JsonOptions>(options =>
{
    options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
Run Code Online (Sandbox Code Playgroud)

有关该问题的更多信息:https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/2293