spring cloud jackson 枚举json互转 枚举json序列化/反序列化
先定义一个枚举基类
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; @JsonDeserialize(using = BaseEnumDeserializer.class)
@JsonSerialize(using = BaseEnumSerializer.class)
public interface BaseEnum { /**
* @description:必须在子类的重写方法返回具体的枚举name ,例如return this.name()<br/>
* @author: Binz
*/
String getCode(); String getDisplayName(); static <E extends Enum<E>> BaseEnum valueOf(String enumCode,Class<E> clazz) {
BaseEnum enumm = (BaseEnum) Enum.valueOf(clazz, enumCode);
return enumm;
}
}
定义自己的枚举并且实现 BaseEnum
/**
* 通用状态,所有跟状态相关的都按照这个定义
* @author Binz
* @date 2019-05-14 11:28:25
*/
public enum CommonStatus implements BaseEnum{
CREATE("新建"),
//一般默认都是这个状态,只有特殊情况才会用到新建状态
ENABLED("启用"),
DISABLED("停用"),
DELETE("删除")
; CommonStatus(String displayName){
this.displayName = displayName;
} private String displayName; @Override
public String getDisplayName() {
return displayName;
} @Override
public String getCode() {
return this.name();
} }
自定义枚举转换器-序列化
import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
/**
* 用于BaseEum的子类解析成json格式,一般在api中注入此解析器
* @author Binz
* 2019-05-27 11:29:02
*/
public class BaseEnumSerializer extends JsonSerializer<BaseEnum>{ @Override
public void serialize(BaseEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
Map<String,String> map = new HashMap<>();
map.put("code", value.getCode());
map.put("displayName", value.getDisplayName());
gen.writeObject(map);
} }
自定义枚举转换器-反序列化
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection; import org.springframework.beans.BeanUtils; import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonStreamContext;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeType; /**
* 接收BaseEnum反序列化
* @author Binz
*/
public class BaseEnumDeserializer extends JsonDeserializer<BaseEnum>{ @SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public BaseEnum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { JsonNode node = jp.getCodec().readTree(jp);
String currentName = jp.currentName();
Object currentValue = jp.getCurrentValue();
Class findPropertyType = null;
if(currentValue instanceof Collection) { JsonStreamContext parsingContext = jp.getParsingContext(); JsonStreamContext parent = parsingContext.getParent();
Object currentValue3 = parent.getCurrentValue();
String currentName3 = parent.getCurrentName();
try {
Field listField = currentValue3.getClass().getDeclaredField(currentName3);
ParameterizedType listGenericType = (ParameterizedType) listField.getGenericType();
Type listActualTypeArguments = listGenericType.getActualTypeArguments()[0];
findPropertyType = (Class) listActualTypeArguments;
} catch (Exception e) {
e.printStackTrace();
}
}else {
findPropertyType = BeanUtils.findPropertyType(currentName, currentValue.getClass());
}
if(findPropertyType == null) {
throw new BaseException("数据格式异常");
}
String asText = null;
if(node.getNodeType() == JsonNodeType.STRING) {
asText = node.asText();
}else{
asText = node.get("code").asText();
}
BaseEnum valueOf = null;
if(StringUtil.isNotBlank(asText)){
valueOf = BaseEnum.valueOf(asText, findPropertyType);
}
return valueOf;
} }
然后spring cloud之间交互的实体类中的枚举就可以自动正常转换了,缺少的引用根据自身项目更改
spring cloud jackson 枚举json互转 枚举json序列化/反序列化的更多相关文章
- SpringBoot 处理 POST Json 传参枚举
在 Spring 框架中对枚举类型的序列化/反序列化是有限制的. 假设如下面这样在某些情况下就不能正常工作: 123456789 public enum PayChannelEnum implemen ...
- Spring Cloud官方文档中文版-Spring Cloud Config(上)
官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...
- 阿里Dubbo疯狂更新,关Spring Cloud什么事?
最近,开源社区发生了一件大事,那个全国 Java 开发者使用最广的开源服务框架 Dubbo 低调重启维护,并且 3 个月连续发布了 4 个维护版本. 我上次在写放弃Dubbo,选择最流行的Spring ...
- 介绍一下Spring Cloud Config
Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring ...
- Spring Cloud Config中文文档
https://springcloud.cc/spring-cloud-config.html 目录 快速开始 客户端使用 Spring Cloud Config服务器 环境库 健康指标 安全 加密和 ...
- 转 阿里Dubbo疯狂更新,关Spring Cloud什么事?
原文地址: http://www.ityouknow.com/springcloud/2017/11/20/dubbo-update-again.html阿里Dubbo疯狂更新,关Spring Clo ...
- spring cloud连载第二篇之Spring Cloud Config
Spring Cloud Config Spring Cloud Config为分布式服务提供了服务侧和客户侧的外部配置支持.通过Spring Cloud Config你可以有一个统一的地方来管理所有 ...
- Spring Cloud官方文档中文版-Spring Cloud Config(上)-服务端(配置中心)
官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则 前面几篇文章较为详细的介绍了Sentinel的使用姿势,还没看过的小伙伴可以访问以下链接查看: &l ...
随机推荐
- BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4810 [题目大意] 给出一个数列,有三种区间查询, 分别查询区间是否存在两个数乘积为x ...
- 【哈希表】Ural Championship April 30, 2017 Problem H. Hamburgers
题意:有n群人,每个人有喜欢的汉堡配方:有m家店,给出每家店的每个汉堡的配方,如果存在某个汉堡,其配料表包含某个人喜欢的配方,则这个人喜欢这个汉堡所在的店家.问你对每群人,输出被喜欢的人数最多的店面是 ...
- 【贪心】【堆】Gym - 101128C - Canvas Painting
一些画布,每块有其大小,一开始都是白的,你任意将它们排序,然后一次操作可以选择一段连续的相同颜色的画布,从中任选一个位置,左侧涂上任意一种颜色,右侧涂上另一种.消耗是这一段画布的总的大小.问你要将所有 ...
- 【带权并查集】poj1182 食物链
带权并查集,或者叫做种类并查集,经典题. http://blog.csdn.net/shuangde800/article/details/7974668 这份代码感觉是坠吼的. 我的代码是暴力分类讨 ...
- java笔记之面向对象
一.面向过程与面向对象的区别 1 面向过程:主要关注点是:实现的具体过程,因果关系[集成显卡的开发思路] * 优点:对于业务逻辑比较简单的程序,可以达到快速开发,前期投入成本较低. * 缺点:采用面向 ...
- 既然有文件后缀名,为何还需要MIME类型?
作者:Vincross链接:https://www.zhihu.com/question/60495696/answer/204530120来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...
- 如何通俗理解——>集群、负载均衡、分布式
转自:周洲 (Julie) 在“高并发,海量数据,分布式,NoSql,云计算......”概念满天飞的年代,相信不少朋友都听说过甚至常与人提起“集群,负载均衡”等,但不是所有人都有机会真正接触到这些技 ...
- Fork & vfork & clone (转载)
转自:http://blog.csdn.net/zqy2000zqy/archive/2006/09/04/1176924.aspx 进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合, ...
- UltraISO(软碟通)制作安装Ubuntu系统的U盘安装盘
1.开UltraISO(软碟通),加载要写入U盘的iso文件,注意,要求软碟通的版本是9.3以上的.如下图: 2.点击“启动光盘.写入硬盘映像: 3.开启个写入硬盘映像的窗口,硬盘驱动器那一项看清楚是 ...
- [转] EPSG CODE的含义
董雨 原文地址 之前一直对WKT.EPSG.SRID不是很理解,总是混淆,今天看了一下,清晰了很多,顺便总结一下,嘿嘿:) EPSG(欧洲石油调查小组):European Petroleum S ...