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

