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

Posted

技术标签:

【中文标题】ASP.NET MVC Core API 将枚举序列化为字符串【英文标题】:ASP.NET MVC Core API Serialize Enums to String 【发布时间】:2020-03-24 12:55:28 【问题描述】:

如何在 ASP.NET MVC Core 3.0 中将 Enum 字段序列化为 String 而不是 Int?我无法以旧方式做到这一点。

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,这意味着您必须在尝试此代码之前显式添加包 【参考方案1】:

新的 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);
    )

更多信息here。文档可以在here找到。

如果你更喜欢 Newtonsoft.Json

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

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson

然后:

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

【讨论】:

如果您有 Web API,那么您也可以使用 .AddMvc() 代替 services.AddControllers().AddJsonOptions(...) 从 asp.net core 3.1 和 Microsoft.AspNetCore.Mvc.NewtonsoftJson 3.1.5 开始,有一点变化:
 services.AddControllers() .AddNewtonsoftJson(opts => opts.SerializerSettings .Converters.Add(new StringEnumConverter())); 
如果我不想跨过吟游诗人怎么办?有没有办法将此作为我的 dto 上的属性? 我发现这个网站很有帮助:jasongaylord.com/blog/2020/07/17/… @drowhunter 如果您只想执行此操作或特定属性,您可以像 [JsonConverter(typeof(JsonStringEnumConverter))] public CategoryDto Category get; set; 一样在返回 DTO 中简单地注释属性。您将需要导入 using System.Text.Json.Serialization 命名空间【参考方案2】:

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

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

options.SerializerSettings.Converters

SerializerSettings 是必须的

【讨论】:

以上是关于ASP.NET MVC Core API 将枚举序列化为字符串的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core MVC 使用 api +javascript 客户端与 ajax

使用 ASP.NET Core MVC 创建 Web API

使用 ASP.NET Core MVC 创建 Web API

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?

用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

使用 ASP.NET Core MVC 创建 Web API