C# WebApi中如何将字符串数组绑定到DTO类的枚举类型List集合
解决方法
ASP.NET Core默认的JSON序列化器仅支持枚举值的数值绑定,要支持字符串名称绑定,根据你使用的序列化器选择对应配置即可:
场景1:使用默认System.Text.Json序列化器(ASP.NET Core 3.0+默认)
方案1:全局配置所有枚举都支持字符串绑定
在项目的Program.cs文件中修改控制器服务注册逻辑,添加枚举字符串转换器:
builder.Services.AddControllers() .AddJsonOptions(options => { // 新增枚举字符串转换器,第二个参数设为true可忽略字符串大小写 options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(allowIntegerValues: true)); });
allowIntegerValues设为true时,数值和字符串格式的枚举值都可以被正常绑定,不需要完全切到字符串格式。
方案2:仅针对指定属性配置
如果不需要全局生效,可直接在DTO的枚举属性上添加转换器特性:
public record MessageDto { [Required] public string Content { get; init; } [JsonConverter(typeof(JsonStringEnumConverter))] public List<MessageType> Types { get; init;} }
场景2:使用Newtonsoft.Json序列化器
如果你是老项目或者显式接入了Newtonsoft.Json,使用对应的转换器即可:
全局配置
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); });
单独属性配置
public record MessageDto { [Required] public string Content { get; init; } [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public List<MessageType> Types { get; init;} }
配置完成后,"Sms"、"sms"(如果开启忽略大小写)、0三种格式都可以正常绑定到枚举列表。
内容的提问来源于stack exchange,提问作者bmrki
相关产品推荐
相关产品推荐

