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 ...
随机推荐
- CNN的发展
模型的建立过程: 1959年,Hubel & Wiesel发现动物视觉皮层中的细胞负责检测感受野(receptive fields)中的光线.论文:Receptive fields and f ...
- MC资源整理
MC模拟简介 蒙特卡罗模拟,因摩纳哥著名的赌场而得名.它能够帮助人们从数学上表述物理.化学.工程.经济学以及环境动力学中一些非常复杂的相互作用. 蒙特卡罗(Monte Carlo)方法,又称随机抽样或 ...
- [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)
差分之后就是求多串LCS. 对其中一个串建SAM,然后把其它串放在上面跑. 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值.答案就是res[ ...
- 20162312 2016-2017-2《Java程序设计》课程总结
一.每周作业链接汇总 预备作业01 写的是有关老师和学生的关系: 预备作业02 如何做中学: 预备作业03 实验楼学习linux环境: 第一周作业 java入门,虚拟机等课前准备: 第二周作业 掌握J ...
- [DesignPattern]Builder设计模式
模式的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 模式的使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部件或零件,都可以装配到一个对象中,但是 ...
- Educational Codeforces Round 8 A. Tennis Tournament 暴力
A. Tennis Tournament 题目连接: http://www.codeforces.com/contest/628/problem/A Description A tennis tour ...
- centos下防火墙iptables日志学习笔记
一直找不到日志方面怎么弄,问了同事,同事给了个网址: http://www.thegeekstuff.com/2012/08/iptables-log-packets/ 下面就是我根据这个网址里面的设 ...
- mysql设置远程访问密码
mysql -u root -p Aaa111222 grant all privileges on *.* to root@'%' identified by 'aaa111222; Quit ln ...
- Sysfs文件系统与Linux设备模型
转:http://www.360doc.com/content/11/1218/16/1299815_173168170.shtml sysfs把连接在系统上的设备和总线组织成为一个分级的目录及文件, ...
- 【maven】pom.xml文件没错,但是项目有小红叉,Problems中可以看到错误:“Dynamic Web Module 3.0 requires Java 1.6 or newer.”
解决方法: 1.将 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>m ...