枚举在 WebAPI 中返回字符串值

Ale*_*lex 15 c# enums asp.net-web-api

我在我的 Web API 项目中遇到了一段代码,它有一个这样结构的类:

public class QuestionDto
{
    public bool disabled {get;set;}
    public int id {get;set;}
    public int order {get;set;}
    public PositionDto pagePosition {get;set;}
    public string title {get;set;}
}

public enum PositionDto
{
    FullWidth = 0,
    Half = 1
}
Run Code Online (Sandbox Code Playgroud)

有一个 API 调用返回QuestionDto,如下:

[Route("")]
[HttpGet]
[ResponseType(typeof(QuestionDto))]
public async Task<IHttpActionResult> GetCategoryQuestions()
{
    return Ok(new QuestionDto { PagePosition = PagePositionDto.Half });
}
Run Code Online (Sandbox Code Playgroud)

这是 Chrome 控制台网络选项卡中的一个片段,显示了此 API 调用的响应:

在此处输入图片说明

枚举如何返回它的文本值,而不是它的 int 值?

为了进一步混淆这一点,如果我然后采用相同的类结构并将其复制并粘贴到不同的项目,则返回此对象的 api 调用将返回 int 值 - 这正是我所期望的。

那么第一个项目可以返回字符串值吗?

是否有一些设置可以使此枚举返回其字符串值?

Ale*_*lex 23

有一个可以添加到变量的设置,它将以 JSON 形式返回字符串值。

它可以像这样在变量声明中设置:

[JsonConverter(typeof(StringEnumConverter))]
public PositionDto pagePosition { get; set; }
Run Code Online (Sandbox Code Playgroud)

或者它可以全局设置,如下所示:

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.Converters.Add(new StringEnumConverter());
Run Code Online (Sandbox Code Playgroud)

  • 如何做到全局,这段代码放在哪里?,请重播 (2认同)
  • @Alex 第二个代码块的第一行,`var json = config. ...` (2认同)

小智 15

对于 .Net 5.0 的 WebAPI,您可以在枚举的全局解决方案ConfigureServices中执行此操作:Startup.cs

services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    options.JsonSerializerOptions.IgnoreNullValues = true;
});
Run Code Online (Sandbox Code Playgroud)


小智 11

如果您使用的是 asp.net 核心,请使用 JsonStringEnumConverter 而不是 StringEnumConverter [JsonConverter(typeof(JsonStringEnumConverter))]


Bas*_*hir 8

对于.NET Core 6,在Program.cs中使用以下代码

builder.Services.AddControllers().AddJsonOptions(options =>
{
   options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());

   options.JsonSerializerOptions.DefaultIgnoreCondition =
       JsonIgnoreCondition.WhenWritingNull;
});
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是在整个项目中执行此操作的好方法,而不仅仅是特定于端点的。这是一种现代方法 (3认同)