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

System.Text.Json:如何将枚举类型字典键序列化为数字

将枚举类型的字典键序列化为数字的实现方法

当然可以实现,以下是针对你使用的System.Text.Json库的具体实现方式:

方法1:使用内置的JsonStringEnumConverter(简洁高效)

利用库内置转换器,通过配置允许整数值,就能让枚举键序列化为对应数字:

public enum MyEnum
{
    One = 1,
    Two = 2
}

var dict = new Dictionary<MyEnum, int>
{
    [MyEnum.One] = 1,
    [MyEnum.Two] = 2
};

var options = new JsonSerializerOptions
{
    Converters = { new JsonStringEnumConverter(allowIntegerValues: true) }
};

string json = JsonSerializer.Serialize(dict, options);
// 输出结果:{"1":1,"2":2}

方法2:自定义枚举转换器(灵活可控)

如果需要更定制化的逻辑,可以编写自定义转换器强制枚举键以数字形式序列化:

public enum MyEnum
{
    One = 1,
    Two = 2
}

// 通用枚举数字转换器
public class EnumNumberConverter<TEnum> : JsonConverter<TEnum> where TEnum : struct, Enum
{
    public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.Number && Enum.TryParse(reader.GetInt32().ToString(), out TEnum result))
        {
            return result;
        }
        throw new JsonException($"无法将值转换为枚举 {typeof(TEnum).Name}");
    }

    public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options)
    {
        writer.WriteNumberValue(Convert.ToInt32(value));
    }
}

// 序列化调用
var dict = new Dictionary<MyEnum, int>
{
    [MyEnum.One] = 1,
    [MyEnum.Two] = 2
};

var options = new JsonSerializerOptions();
options.Converters.Add(new EnumNumberConverter<MyEnum>());

string json = JsonSerializer.Serialize(dict, options);
// 输出结果:{"1":1,"2":2}

补充:Newtonsoft.Json(Json.NET)的实现方式

如果你的项目使用Newtonsoft.Json,配置方式类似:

var settings = new JsonSerializerSettings
{
    Converters = { new StringEnumConverter { AllowIntegerValues = true } }
};

string json = JsonConvert.SerializeObject(dict, settings);
// 输出结果:{"1":1,"2":2}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:35:20