自定义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
相关产品推荐
相关产品推荐

