You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:20:25