找回密码
 立即注册
首页 业界区 业界 JsonConvert反序列化枚举转换

JsonConvert反序列化枚举转换

溥价 2025-7-16 13:00:48
适用场景:反序列化对象里面存在枚举类型

说明

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

实现方式主要是通过继承JsonConverter,在转换的过程中添加对输入值,以及输出对象的格式进行校验,确保能安全准确的处理枚举类型
核心代码:
  1.     public class SafeEnumConverter<T> : JsonConverter where T : struct
  2.     {
  3.         public override bool CanConvert(Type objectType)
  4.         {
  5.             return objectType == typeof(T);
  6.         }
  7.         public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  8.         {
  9.             if (reader.TokenType == JsonToken.String)
  10.             {
  11.                 var enumText = reader.Value.ToString();
  12.                 if (string.IsNullOrEmpty(enumText))
  13.                     return default(T);
  14.                 // 先尝试数字
  15.                 int intValue;
  16.                 if (int.TryParse(enumText, out intValue))
  17.                     return (T)Enum.ToObject(typeof(T), intValue);
  18.                 // 再尝试枚举名
  19.                 T value;
  20.                 if (Enum.TryParse<T>(enumText, true, out value))
  21.                     return value;
  22.             }
  23.             else if (reader.TokenType == JsonToken.Integer)
  24.             {
  25.                 return (T)Enum.ToObject(typeof(T), Convert.ToInt32(reader.Value));
  26.             }
  27.             return default(T);
  28.         }
  29.         public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  30.         {
  31.             writer.WriteValue(Convert.ToInt32(value));
  32.         }
  33.     }
复制代码

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

在需要的枚举属性上加特性,或全局注册:
  1. [JsonConverter(typeof(SafeEnumConverter<MyEnum>))]
  2. public MyEnum Status { get; set; }
复制代码
或者
  1. JsonConvert.DeserializeObject<T>(json, new SafeEnumConverter<MyEnum>());
复制代码
能兼容数字、字符串等多种Json输入的转换

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册