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

自定义StringEnumConverter未处理Draft枚举值,求排查原因

排查Draft枚举未触发自定义StringEnumConverter的问题

核心原因分析

Draft枚举未触发断点,说明该枚举的序列化过程根本没有使用你自定义的StringEnumConverter,其他枚举正常是因为它们正确关联了转换器。以下是具体排查方向和解决办法:

1. 检查Draft枚举是否未绑定自定义转换器

  • 查看Draft所属枚举的定义,确认是否添加了自定义转换器特性:
    // 确保枚举上添加了你的自定义转换器特性(注意是自己实现的那个,不是Newtonsoft默认的)
    [JsonConverter(typeof(StringEnumConverter))]
    public enum Status
    {
        Draft,
        Regular,
        AnnualLeave
    }
    
  • 如果是全局配置转换器,检查JsonSerializerSettings是否正确添加了你的转换器,且没有针对Draft枚举的排除逻辑:
    var settings = new JsonSerializerSettings();
    // 全局注册自定义转换器
    settings.Converters.Add(new StringEnumConverter());
    // 序列化Draft时必须使用这个配置
    var json = JsonConvert.SerializeObject(Status.Draft, settings);
    

2. 检查Draft枚举值是否有特性覆盖行为

如果Draft枚举值添加了[EnumMember]或[JsonProperty]特性,Json.NET会优先使用特性指定的值,跳过自定义转换器的逻辑:

public enum Status
{
    [EnumMember(Value = "Draft")] // 该特性会让序列化直接输出"Draft",不走转换器
    Draft,
    ...
}

解决办法:

  • 移除这类特性,让自定义转换器接管转换逻辑;
  • 或者修改转换器代码,兼容特性值的处理(优先读取特性值再转蛇形大写):
    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        if (value is Enum enumValue)
        {
            string enumString;
            // 先尝试读取EnumMember特性的值
            var enumMember = enumValue.GetType()
                .GetMember(enumValue.ToString())
                .FirstOrDefault()?
                .GetCustomAttribute<System.Runtime.Serialization.EnumMemberAttribute>();
            
            if (enumMember != null && !string.IsNullOrEmpty(enumMember.Value))
            {
                enumString = enumMember.Value;
            }
            else
            {
                enumString = enumValue.ToString();
            }
            
            var snakeCase = Regex.Replace(enumString, "([a-z])([A-Z])", "$1_$2").ToUpper();
            writer.WriteValue(snakeCase);
        }
        else
        {
            base.WriteJson(writer, value, serializer);
        }
    }
    

3. 确认序列化Draft的代码路径是否使用了正确配置

检查序列化Draft的代码,是否误用了默认序列化(未传入包含自定义转换器的JsonSerializerSettings),或者在局部代码中为该枚举指定了其他转换器:

// 错误示例:使用默认序列化,不会加载自定义转换器
var json = JsonConvert.SerializeObject(Status.Draft);
// 正确示例:使用包含自定义转换器的配置
var json = JsonConvert.SerializeObject(Status.Draft, settings);

内容的提问来源于stack exchange,提问作者Martyn C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:55:07