如何让StringEnumConverter遇无效枚举值时抛出错误而非使用默认值?
解决枚举反序列化无效值自动 fallback 的问题
你的问题根源在于StringEnumConverter的默认行为:当遇到无法匹配的枚举字符串值时,它会返回枚举的默认值(即数值为0的第一个成员Hi)。要实现无效值时抛出错误,需要修改转换器的配置,开启严格校验。
方法一:针对单个枚举配置严格转换器
创建一个继承自StringEnumConverter的自定义转换器,强制关闭无效值允许:
using Newtonsoft.Json; using Newtonsoft.Json.Converters; public class StrictStringEnumConverter : StringEnumConverter { public StrictStringEnumConverter() { // 禁止无效枚举值,遇到不匹配的字符串时抛出异常 AllowInvalidEnumValues = false; } }
然后将这个自定义转换器应用到你的枚举上:
[JsonConverter(typeof(StrictStringEnumConverter))] public enum EmailTemplateType { Hi, Hello, Welcome, }
方法二:全局配置所有枚举的严格校验
如果希望所有枚举都遵循严格校验规则,可以在项目启动时设置全局序列化规则:
using Newtonsoft.Json; using Newtonsoft.Json.Converters; // 示例:在Startup.cs或Program.cs中配置 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = new List<JsonConverter> { new StringEnumConverter { AllowInvalidEnumValues = false } }, // 可选:开启缺失成员校验,防止请求中出现未定义字段 MissingMemberHandling = MissingMemberHandling.Error };
效果验证
当请求传入无效值(如"Abc")时,反序列化过程会直接抛出JsonSerializationException,你可以在API的异常处理逻辑中捕获该异常,返回对应的错误响应(比如400 Bad Request)。
内容的提问来源于stack exchange,提问作者Hooch
相关产品推荐
相关产品推荐

