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),而不是字符串。
使用方法
在需要的枚举属性上加特性,或全局注册:
[JsonConverter(typeof(SafeEnumConverter<MyEnum>))]
public MyEnum Status { get; set; }
或者
JsonConvert.DeserializeObject<T>(json, new SafeEnumConverter<MyEnum>());
能兼容数字、字符串等多种Json输入的转换
JsonConvert反序列化枚举转换的更多相关文章
- mybatis自定义枚举转换类
转载自:http://my.oschina.net/SEyanlei/blog/188919 mybatis提供了EnumTypeHandler和EnumOrdinalTypeHandler完成枚举类 ...
- Mybatis枚举转换
自定义mybatis枚举转换,原理是如果用户没有定义自己的枚举转换工具,mybatis在解析枚举类时会自动获取mybatis的BaseTypeHandler,来转换枚举类,我们只需要重写这个枚举转换器 ...
- (转)C# Enum,Int,String的互相转换 枚举转换
Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...
- C# Enum,Int,String的互相转换 枚举转换
Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...
- spring mvc4的日期/数字格式化、枚举转换
日期.数字格式化显示,是web开发中的常见需求,spring mvc采用XXXFormatter来处理,先看一个最基本的单元测试: package com.cnblogs.yjmyzz.test; i ...
- (转载)C#:Enum、Int和String的互相转换,枚举转换
Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举.注意:枚举类型的基类 ...
- 【转】C# Enum,Int,String的互相转换 枚举转换
Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...
- Enum,Int,String的互相转换 枚举转换
Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...
- (转)C# Enum,Int,String的互相转换 枚举转换--非常实用
Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...
- Jackson反序列化枚举类型解决方案
BUG描述 在使用SpringBoot自带的jackson处理客户端提交的消息体反序列化时,遇到一个非常棘手的情况 客户端发送如下json {"content":"654 ...
随机推荐
- fiddler模拟弱网配置
1.延长加载时间 Rules-cumtomize rules,打开fiddler scripteditor 搜索simulatemodem-更改时间为需要延长加载的时间(单位为毫秒)-保存退出 2.打 ...
- 一个简单的struts2配置
目录 1 需求 2 需要导入的jar包 3 项目的目录结构 3.1 demo1.jsp 3.2 success.jsp 3.3 HelloAction.java 3.4 struts.xml 3.5 ...
- 【经验】C++|利用 Windows API,通过文件句柄获取文件路径的两种方式
方法一 主要参考博客:根据文件句柄获得文件名(这篇超级清晰,就是有一点点小问题) 通过文件句柄获得文件路径(这篇不是很好用,但是思路大体是一致的) 主要思路: 根据HANDLE 创建映射文件,调用Ge ...
- 用AI开发AI翻译助手:初学者也能轻松做出第一个应用
在过去,学习编程往往意味着大量阅读文档.理解晦涩的语法.查找资料,甚至要面对一个接一个的报错信息,这对初学者来说常常是一个令人望而生畏的过程.但在AI时代,这一切都变得不一样了. 我最近完成了一个小项 ...
- Oracle链接服务器导致SQL Server异常终止
现象 首先该链接服务器是使用 OraOLEDB provider (OLEDB Provider for Oracle)创建的,在使用该链接服务器的SQL语句中出现特殊字符 "--" ...
- 笔记 - linux子系统更换阿里云镜像源
平时还是用 windows 多一些, 偶尔会玩一玩 linux, 之前给我一台多年的笔记本装了个 manjaro , 颜值是蛮高的, 就一点也不太熟, 就不想玩了, 还是用子系统, win 有支持 U ...
- 云服务器的CPU利用率,外网出带宽使用率,内存利用率,磁盘利用率
云服务器的CPU利用率.外网出带宽使用率.内存利用率和磁盘利用率是用于监测服务器性能和资源使用情况的关键指标,它们各自代表不同方面的服务器运行状态: CPU利用率:CPU(中央处理单元)利用率表示服务 ...
- TEA密码与逆向工程
前置信息 TEA系列概述:TEA算法是一种分组密码算法,由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明.它使用64位的明文分组和128位的密钥进行加 ...
- Qt图像处理技术二:对QImage图片简单滤镜(暖色,冷色,反色,老照片,灰度)
列举单色滤镜 1.暖色 2.冷色 3.反色 4.老照片 5.灰度 github代码(持续更新) 期待你的小星星 github:https://github.com/dependon/simple-im ...
- FastAPI认证系统:从零到令牌大师的奇幻之旅
title: FastAPI认证系统:从零到令牌大师的奇幻之旅 date: 2025/06/06 16:13:06 updated: 2025/06/06 16:13:06 author: cmdra ...