先定义一个枚举基类

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. 洛谷——P1223 排队接水

    P1223 排队接水 题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行, ...

  2. ansible学习-playbook的YAML语法

    [一篇非常好的ansible参考博文] 初识Ansible http://liumissyou.blog.51cto.com/4828343/1616462 --------------------- ...

  3. C++中的读入输出优化及清新脱俗的宏命令

    C和C++有了#define,从此它就变了模样 宏命令就是#define,#if,#error之类的 本文主要介绍宏命令和相关的骚操作 读入输出优化 inline int read() { int a ...

  4. 【SAM】BZOJ2882-工艺

    [题目大意] 求一个循环数列的最小表示法. [思路] 最小表示法的正解:★ SAM乱搞,和前面的POJ那道一样.然而MLE了,当作学习一下map的用法^ ^ map的使用方法(来源:☆) 一.map的 ...

  5. Generator函数(一)

    Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同.对于这个函数有多种理解.从语法上来理解,可以将它理解成一个状态机,封装了多个内部状态.内部的不同状态是通过yiel ...

  6. php读取超大文件fseek

    function readMaxFile($fp , $start = 0) { $tag = "\n"; $i = 0; $content = ''; while($i < ...

  7. centos6.5编译安装nginx

    系统64位 centos6.5 nginx官网:http://nginx.org/ 下载nginx源码包: wget  http://nginx.org/download/nginx-1.6.2.ta ...

  8. MATLAB/Octave warning: mx_el_eq: automatic broadcasting operation applied 错误分析

    在进行对一个mXn的矩阵与mX1的矩阵进行==比较时,原意是想让mXn的矩阵的每一行分别与mX1的矩阵每一行进行比较,得到的结果虽然是对的,但会报一个warning: mx_el_eq: automa ...

  9. NTP安全漏洞公告

        NTP服务今天公告了几个高危漏洞,大概信息如下: 描述:包含缓冲区溢出等多个高危或低危漏洞. 危害:可以利用获取服务器权限完全控制服务器,至少可以造成服务器崩溃. 影响范围:只有升级到4.2. ...

  10. winform listview默认第一项光标选中

    if (this.lsvSortingHeadList.Items.Count > 0) { this.lsvSortingHeadList.Focus(); this.lsvSortingHe ...