ASP.NET Core如何将所有Enum序列化为大写格式?
ASP.NET API枚举返回大写格式的问题解决
我在ASP.NET应用中有如下枚举:
public enum Status { Active, Inactive, Offline }
希望API响应中将枚举值返回为大写格式(比如Status: "INACTIVE"而非Status: "Inactive"),但尝试自定义转换器并注册后并未生效。
自定义转换器代码:
public sealed class EnumUpperCaseConverter<TEnum> : JsonConverter<TEnum?> where TEnum : struct, Enum { public override TEnum? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String) { string enumValue = reader.GetString(); if (Enum.TryParse(enumValue, true, out TEnum result)) { return result; } } else if (reader.TokenType == JsonTokenType.Null) { return null; } throw new JsonException($"Unable to parse enum from {reader.TokenType}"); } public override void Write(Utf8JsonWriter writer, TEnum? value, JsonSerializerOptions options) { string enumValue = value?.ToString().ToUpper(); writer.WriteStringValue(enumValue); } }
Program.cs中的注册代码:
builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.Converters.Add(new EnumUpperCaseConverter<>()); });
疑问:是否有更简便的实现方式?或者只能直接将所有枚举值改为大写?
问题原因
你注册转换器的顺序和方式存在问题:
JsonStringEnumConverter是内置枚举转换器,会优先匹配枚举类型,导致自定义转换器无法被触发- 泛型转换器
EnumUpperCaseConverter<>的注册未指定具体枚举类型,无法正确匹配目标类型
解决方案
方案一:使用内置转换器实现(最简便)
无需自定义转换器,直接利用JsonStringEnumConverter的重载,传入自定义大写命名策略即可:
- 定义大写命名策略:
public class UpperCaseNamingPolicy : JsonNamingPolicy { public override string ConvertName(string name) { return name.ToUpper(); } }
- 修改Program.cs中的注册代码:
builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(new UpperCaseNamingPolicy())); });
方案二:修复自定义转换器的使用
如果坚持使用自定义转换器,需要调整注册逻辑:
- 移除
JsonStringEnumConverter的注册,避免冲突 - 为每个枚举类型明确注册转换器:
builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new EnumUpperCaseConverter<Status>()); // 如有其他枚举,依次添加: // options.JsonSerializerOptions.Converters.Add(new EnumUpperCaseConverter<OtherEnum>()); });
方案三:直接修改枚举值(不推荐)
直接将枚举成员改为大写命名:
public enum Status { ACTIVE, INACTIVE, OFFLINE }
这种方式虽简单,但会破坏C#枚举PascalCase的命名规范,不建议采用。
内容的提问来源于stack exchange,提问作者Dunnoman
相关产品推荐
相关产品推荐

