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

C#如何将带EnumMember的枚举赋值给类对象并序列化为指定字符串值

问题说明

定义了带EnumMember特性的枚举类型:

using System.Runtime.Serialization;

public enum Vehicle
{
    [EnumMember(Value = "Use of Carriage")]
    UseofCarriage
}

使用Newtonsoft.Json的JsonConvert.SerializeObject序列化包含该枚举的类对象时,枚举值默认被序列化为数字0,期望输出EnumMember配置的自定义字符串"Use of Carriage"。
测试用的核心代码如下:

public void TestCase1()
{
    // Arrange
    var vehicle = new VehicleClass();
    vehicle.Vehicle = Vehicle.UseofCarriage;

    // Act
    string output = JsonConvert.SerializeObject(vehicle);

    // Assert
    _test.WriteLine(output);
}
实现方法

出现这个问题的原因是Newtonsoft.Json默认将枚举序列化为整数,且不会主动解析EnumMember特性的配置值,需要显式添加StringEnumConverter转换器来实现字符串枚举序列化,该转换器会自动读取EnumMember配置的自定义值。

方式1:单次序列化指定配置

修改序列化代码,传入序列化配置添加转换器,仅对当前序列化生效:

string output = JsonConvert.SerializeObject(vehicle, new JsonSerializerSettings
{
    Converters = { new StringEnumConverter() }
});

方式2:通过特性标记指定规则

可以直接在枚举类型、或类中对应的枚举属性上标记JsonConverter特性,标记后所有对该类型/属性的序列化都会自动按字符串规则处理,不需要每次传配置:

  • 标记在枚举定义上:
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Runtime.Serialization;

[JsonConverter(typeof(StringEnumConverter))]
public enum Vehicle
{
    [EnumMember(Value = "Use of Carriage")]
    UseofCarriage
}
  • 标记在类的属性上:
public class VehicleClass
{
    [JsonConverter(typeof(StringEnumConverter))]
    public Vehicle Vehicle { get; set; }
}

方式3:全局配置生效

如果是Web项目等需要全局统一枚举序列化规则的场景,可以在程序启动时全局配置Newtonsoft.Json的序列化选项,添加StringEnumConverter,后续所有序列化操作都会自动按字符串规则处理枚举:

// ASP.NET Core 项目在Program.cs/Startup.cs中配置示例
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.Converters.Add(new StringEnumConverter());
    });

补充:如果你使用的是.NET内置的System.Text.Json进行序列化,对应的转换器为JsonStringEnumConverter,配置逻辑一致,同样支持识别EnumMember特性的自定义值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:00:57