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

使用方法

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

复制代码
[JsonConverter(typeof(SafeEnumConverter<MyEnum>))]
public MyEnum Status { get; set; }

或者

复制代码
JsonConvert.DeserializeObject<T>(json, new SafeEnumConverter<MyEnum>());

能兼容数字、字符串等多种Json输入的转换

相关推荐
加号32 小时前
【C#】 文件与目录管理:创建、删除操作的技术解析
开发语言·c#
用户395240998806 小时前
SqlSugar 连接 PostgreSQL 报错 42P01: relation does not exist 的排查与修复
c#
2601_961875247 小时前
法考考试时间安排及科目|时间表|资料已整理
开发语言·c#·inverted-index·suffix-tree·sstable·r-tree·lsm-tree
ServBay7 小时前
你跟高级 C# 工程师的区别,就是这8个开发技巧
后端·c#·.net
2601_9618752412 小时前
法考备考计划表|学习计划|资料已整理
java·开发语言·学习·eclipse·tomcat·c#·hibernate
Y学院12 小时前
C#游戏脚本开发全流程(Unity通用完整版)
游戏·unity·c#
淡海水14 小时前
38-Hybrid生态-LeanCLR总览
unity·架构·c#·热更新·clr·hybrid·leanclr
iCxhust15 小时前
C# 生成命令行程序 将hex格式烧录程序转换成bin烧录格式
开发语言·汇编·单片机·嵌入式硬件·c#·微机原理
xiaoshuaishuai815 小时前
C# 封装与继承
开发语言·c#
FL162386312915 小时前
基于C#winform使用纯opencv部署ppocrv5和ppocrv6的onnx模型进行OCR文件检测识别
opencv·c#·ocr