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

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<>());
});

疑问:是否有更简便的实现方式?或者只能直接将所有枚举值改为大写?


问题原因

你注册转换器的顺序和方式存在问题:

  1. JsonStringEnumConverter是内置枚举转换器,会优先匹配枚举类型,导致自定义转换器无法被触发
  2. 泛型转换器EnumUpperCaseConverter<>的注册未指定具体枚举类型,无法正确匹配目标类型

解决方案

方案一:使用内置转换器实现(最简便)

无需自定义转换器,直接利用JsonStringEnumConverter的重载,传入自定义大写命名策略即可:

  1. 定义大写命名策略:
public class UpperCaseNamingPolicy : JsonNamingPolicy
{
    public override string ConvertName(string name)
    {
        return name.ToUpper();
    }
}
  1. 修改Program.cs中的注册代码:
builder.Services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(new UpperCaseNamingPolicy()));
});

方案二:修复自定义转换器的使用

如果坚持使用自定义转换器,需要调整注册逻辑:

  1. 移除JsonStringEnumConverter的注册,避免冲突
  2. 为每个枚举类型明确注册转换器:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:23:38