溥价 发表于 2025-7-16 13:00:48

JsonConvert反序列化枚举转换

适用场景:反序列化对象里面存在枚举类型

说明

在使用JsonConvert.DeserializeObject转换对象的时候,想要更直观的看到值对应的含义,一般会设定一个枚举值,但是在转换的时候,由于传入值的不确定,会无法识别枚举具体类型而报错,需要我们手动拓展
实现

实现方式主要是通过继承JsonConverter,在转换的过程中添加对输入值,以及输出对象的格式进行校验,确保能安全准确的处理枚举类型
核心代码:
    public class SafeEnumConverter<T> : JsonConverter where T : struct
    {
      public override bool CanConvert(Type objectType)
      {
            return objectType == typeof(T);
      }

      public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
      {
            if (reader.TokenType == JsonToken.String)
            {
                var enumText = reader.Value.ToString();
                if (string.IsNullOrEmpty(enumText))
                  return default(T);

                // 先尝试数字
                int intValue;
                if (int.TryParse(enumText, out intValue))
                  return (T)Enum.ToObject(typeof(T), intValue);

                // 再尝试枚举名
                T value;
                if (Enum.TryParse<T>(enumText, true, out value))
                  return value;
            }
            else if (reader.TokenType == JsonToken.Integer)
            {
                return (T)Enum.ToObject(typeof(T), Convert.ToInt32(reader.Value));
            }
            return default(T);
      }

      public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
      {
            writer.WriteValue(Convert.ToInt32(value));
      }
    }
[*]通过重写CanConvert,判断当前转换器是否能处理类型 T,只针对类型T进行转换
[*]ReadJson是转换的核心,实现将 JSON 字符串或数字安全地转换为枚举类型 T。
- 如果 JSON 是字符串(如 "1" 或 "EnumName"):
先尝试转成数字(如 "1" → 1 → 枚举值)。
再尝试转成枚举名(如 "EnumName" → 枚举值)。
- 如果 JSON 是数字(如 1):
直接转成枚举值。
- 如果都不行,返回默认值(通常是0)。
[*]WriteJson:结果输出,将枚举值序列化为数字(int),而不是字符串。
使用方法

在需要的枚举属性上加特性,或全局注册:

public MyEnum Status { get; set; }或者
JsonConvert.DeserializeObject<T>(json, new SafeEnumConverter<MyEnum>());能兼容数字、字符串等多种Json输入的转换

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

喳谍 发表于 2025-11-27 08:40:02

热心回复!

巴沛若 发表于 2025-11-28 00:55:41

感谢,下载保存了

管水芸 发表于 2025-12-15 12:11:07

yyds。多谢分享

掳诚 发表于 2026-1-3 19:48:02

这个好,看起来很实用

甘子萱 发表于 2026-1-4 19:19:06

感谢分享,下载保存了,貌似很强大

事确 发表于 2026-1-17 05:38:30

感谢分享

岑韬哎 发表于 2026-1-17 08:01:06

新版吗?好像是停更了吧。

思矿戳 发表于 2026-1-18 10:11:35

不错,里面软件多更新就更好了

矛赓宁 发表于 2026-1-20 09:13:22

用心讨论,共获提升!

类饲冰 发表于 2026-1-20 09:32:22

过来提前占个楼

龙骋唧 发表于 2026-1-21 17:51:45

鼓励转贴优秀软件安全工具和文档!

处匈跑 发表于 2026-1-22 07:08:03

感谢分享,学习下。

账暴 发表于 2026-1-24 11:35:24

yyds。多谢分享

届表 发表于 2026-1-28 06:08:21

感谢分享,学习下。

何玲 发表于 2026-1-30 03:22:13

感谢发布原创作品,程序园因你更精彩

穆望 发表于 2026-2-3 03:04:03

鼓励转贴优秀软件安全工具和文档!

宁觅波 发表于 2026-2-5 04:17:19

用心讨论,共获提升!

仰翡邸 发表于 2026-2-7 08:30:41

感谢分享,学习下。

赖珊 发表于 2026-2-7 08:43:02

很好很强大我过来先占个楼 待编辑
页: [1] 2 3
查看完整版本: JsonConvert反序列化枚举转换