枚举在WebAPI中返回字符串值

时间:2018-02-23 14:03:12

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

我在我的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调用的回复:

enter image description here

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

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

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

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

返回确定(新QuestionDto {PagePosition.Value = PagePositionDto.Half.Value});

答案 3 :(得分:1)

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

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

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

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

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

答案 4 :(得分:1)

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