ASP.NET MVC Core API序列化枚举为字符串

98
在ASP.NET MVC Core 3.0中如何让枚举字段以字符串形式而非整数形式进行序列化?我无法以旧的方式实现它。
services.AddMvc().AddJsonOptions(opts =>
{
    opts.JsonSerializerOptions.Converters.Add(new StringEnumConverter());
})

我遇到了一个错误:

无法将 'Newtonsoft.Json.Converters.StringEnumConverter' 转换为 'System.Text.Json.Serialization.JsonConverter'


ASP.NET Core 3.0 不包含 JSON.NET,这意味着在尝试此代码之前必须显式添加该软件包。 - Panagiotis Kanavos
5个回答

200

新的System.Text.Json序列化

ASP.NET MVC Core 3.0使用内置的JSON序列化。使用System.Text.Json.Serialization.JsonStringEnumConverter(带有“Json”前缀):

services
    .AddMvc()
    // Or .AddControllers(...)
    .AddJsonOptions(opts =>
    {
        var enumConverter = new JsonStringEnumConverter();
        opts.JsonSerializerOptions.Converters.Add(enumConverter);
    })

更多信息请点击此处。文档可以在此处找到。

如果您喜欢 Newtonsoft.Json

您也可以使用“传统”的 Newtonsoft.Json 序列化:

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson

然后:

services
    .AddControllers()
    .AddNewtonsoftJson(opts => opts
        .Converters.Add(new StringEnumConverter()));

28
如果您拥有一个Web API,那么除了使用.AddMvc()外,您还可以使用services.AddControllers().AddJsonOptions(...) - Tobias
27
截至 Asp.Net Core 3.1 和 Microsoft.AspNetCore.Mvc.NewtonsoftJson 3.1.5,有一个轻微的变化:<pre> services.AddControllers() .AddNewtonsoftJson(opts => opts.SerializerSettings.Converters.Add(new StringEnumConverter())); </pre> - Sudhanshu Mishra
1
如果我不想在整个程序中都这样做怎么办?有没有一种方法可以将其作为我的DTO属性来实现? - drowhunter
我觉得这个网站非常有帮助:https://www.jasongaylord.com/blog/2020/07/17/adding-newtonsoft-json-to-services - ashlar64
8
如果你只想做这个或特定的属性,你可以在返回的 DTO 中简单地注释该属性,就像这样 [JsonConverter(typeof(JsonStringEnumConverter))] public CategoryDto Category { get; set; }。你需要导入 using System.Text.Json.Serialization 命名空间。 - Gavin
谢谢,这对我有用。services.AddControllers()..AddJsonOptions(opts => { opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }) - Qwerty

26

一些补充:
如果使用Newtonsoft.Json

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson
services
    .AddControllers()
    .AddNewtonsoftJson(options =>
        options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()));

选项 SerializerSettings.Converters

SerializerSettings 是必需的


22

如果您有一个Minimal API,这将非常有用:

using System.Text.Json.Serialization;

builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(opt =>
{
    opt.SerializerOptions.Converters.Add(new JsonStringEnumConverter());
});

11

.NET 7.0 引入了这种方式:

builder.Services.ConfigureHttpJsonOptions(options => options.SerializerOptions.Converters.Add(new JsonStringEnumConverter()));

2
如果您正在使用 Aspnet Core MVC 和最小API,请使用以下代码:
services.Configure<Microsoft.AspNetCore.Mvc.JsonOptions>(o => o.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接