WebAPI 中返回字符串值的枚举

问题描述 投票:0回答:6

我在我的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
}

有一个 API 调用返回

QuestionDto
,大致如下:

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

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

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

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

那么第一个项目如何返回字符串值?

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

c# asp.net-web-api enums
6个回答
41
投票

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

它可以在变量声明上设置,如下所示:

[JsonConverter(typeof(StringEnumConverter))]
public PositionDto pagePosition { get; set; }

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

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.Converters.Add(new StringEnumConverter());

20
投票

如果您使用的是 asp.net core 或 dotnet 6,请使用 JsonStringEnumConverter 而不是 StringEnumConverter

  [JsonConverter(typeof(JsonStringEnumConverter))]


15
投票

对于 .Net 5.0 的 WebAPI,您可以在

ConfigureServices
中的
Startup.cs
中执行此操作,以获得枚举的全局解决方案:

services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    options.JsonSerializerOptions.IgnoreNullValues = true;
});

8
投票

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

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

   options.JsonSerializerOptions.DefaultIgnoreCondition =
       JsonIgnoreCondition.WhenWritingNull;
});

2
投票

Alex 有正确的答案 - 只需添加一点 - 如果您使用 Newtonsoft.Json,则需要包含“using Newtonsoft.Json.Converters;”使 StringEnumConverter 可用。


-1
投票
return Ok(new QuestionDto { PagePosition.Value = PagePositionDto.Half.Value });
© www.soinside.com 2019 - 2024. All rights reserved.