【问题标题】:Enum returning string value in WebAPI在 WebAPI 中枚举返回字符串值
【发布时间】:2022-05-08 03:05:27
【问题描述】:

我在我的 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 值 - 这是我所期望的。

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

是否有一些设置可以使这个枚举返回它的字符串值?

【问题讨论】:

  • 如何序列化枚举?
  • 应该是new QuestionDto {pagePosition = PositionDto.Half};?
  • 我猜(如果没有 a lot more info 这将是一个猜测)您已经在代码中的某处定义了一个自定义序列化程序(可能在 Startup.cs 但是这可能会有所不同)
  • @Liam 这是正确的答案 - 如果您将其添加为答案,我会将其标记为正确
  • 尝试在项目中搜索类似的东西 - StringEnumConverter。如果它被添加到全局 api 配置中,那么这就是它返回字符串的原因。

标签: c# asp.net-web-api enums


【解决方案1】:

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

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

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

也可以全局设置,像这样:

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

【讨论】:

  • 全局怎么弄,这段代码在哪里?,请重播
  • config 变量是什么,它从何而来?在最初的问题中,没有这样的变量,也没有明显的方法来检索它。
  • @lwchris 我在这个答案中看不到任何对配置变量的引用?
  • @Alex 第二个代码块的第一行,var json = config. ...
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        对于 .net coer6,在 program.cs 中使用以下代码

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

        【讨论】:

        • 这实际上是在整个项目中执行此操作的好方法,而不仅仅是特定于端点。并且是一种现代方法
        【解决方案6】:

        返回 Ok(new QuestionDto { PagePosition.Value = PagePositionDto.Half.Value });

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-16
          • 2021-05-18
          相关资源
          最近更新 更多