先定义一个枚举基类

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序列化/反序列化的更多相关文章

  1. SpringBoot 处理 POST Json 传参枚举

    在 Spring 框架中对枚举类型的序列化/反序列化是有限制的. 假设如下面这样在某些情况下就不能正常工作: 123456789 public enum PayChannelEnum implemen ...

  2. Spring Cloud官方文档中文版-Spring Cloud Config(上)

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...

  3. 阿里Dubbo疯狂更新,关Spring Cloud什么事?

    最近,开源社区发生了一件大事,那个全国 Java 开发者使用最广的开源服务框架 Dubbo 低调重启维护,并且 3 个月连续发布了 4 个维护版本. 我上次在写放弃Dubbo,选择最流行的Spring ...

  4. 介绍一下Spring Cloud Config

    Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring ...

  5. Spring Cloud Config中文文档

    https://springcloud.cc/spring-cloud-config.html 目录 快速开始 客户端使用 Spring Cloud Config服务器 环境库 健康指标 安全 加密和 ...

  6. 转 阿里Dubbo疯狂更新,关Spring Cloud什么事?

    原文地址: http://www.ityouknow.com/springcloud/2017/11/20/dubbo-update-again.html阿里Dubbo疯狂更新,关Spring Clo ...

  7. spring cloud连载第二篇之Spring Cloud Config

    Spring Cloud Config Spring Cloud Config为分布式服务提供了服务侧和客户侧的外部配置支持.通过Spring Cloud Config你可以有一个统一的地方来管理所有 ...

  8. Spring Cloud官方文档中文版-Spring Cloud Config(上)-服务端(配置中心)

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...

  9. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则 前面几篇文章较为详细的介绍了Sentinel的使用姿势,还没看过的小伙伴可以访问以下链接查看: &l ...

随机推荐

  1. 关于 Unity WebGL 的探索(二)

    关于 Unity WebGL 的探索(二) 上一篇博客记录了关于 WebGL 移植的第一步:部分 C/C++ 插件的编译,目前项目中的部分插件使用该方法通过,接下来比较大的一部分工作量是网络模块 We ...

  2. Codeforces Beta Round #14 (Div. 2) Two Paths (树形DP)

    Two Paths time limit per test 2 seconds memory limit per test 64 megabytes input standard input outp ...

  3. poj 3132

    Sum of Different Primes Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3360   Accepted ...

  4. [JSOI2018]军训列队

    [JSOI2018]军训列队 题目大意: \(n(n\le5\times10^5)\)个学生排成一排,第\(i\)个学生的位置为\(a_i\).\(m(m\le5\times10^5)\)次命令,每次 ...

  5. Springcloud中的region和zone的使用

    一.背景 用户量比较大或者用户地理位置分布范围很广的项目,一般都会有多个机房.这个时候如果上线springCloud服务的话,我们希望一个机房内的服务优先调用同一个机房内的服务 ,当同一个机房的服务不 ...

  6. 判断隐式Intent是否有响应

    PackageManager manager = getContext().getPackageManager(); if (manager.queryIntentActivities(intent, ...

  7. 阿里云ECS使用SSH连接CentOS 6.9经常断线的问题解决:OperationTimedOut

    说明:不一定有效,可以试一下. 设置: vi /etc/ssh/sshd_config #添加或修改以下配置 ClientAliveInterval #每隔多少秒给SSH客户端发送一次信号 Clien ...

  8. 【web 回车】web项目 注册或登录页面 回车登录无效,解决方案

    解决方案: /** * 登陆按钮的点击事件 */ $("#loginID").click(function(){ var username = $("#u"). ...

  9. lykchat信息发送系统

    lykchat信息发送系统是Python3开发的,通过模拟微信网页端,基于个人微信号,为系统管理人员提供信息发送工具. 实现的功能有用户登录管理.微信登陆管理和微信信息发送功能. 代码地址:https ...

  10. iOS:导航条滚动透明度随着tableView的滚动而变化

    来源:HelloYeah 链接:http://www.jianshu.com/p/b8b70afeda81 下面这个界面有没有觉得很眼熟.打开你手里的App仔细观察,你会发现很多都有实现这个功能.比如 ...