搜索
简帛阁>技术文章>spring cloud jackson 枚举json互转 枚举json序列化/反序列化

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之间交互的实体类中的枚举就可以自动正常转换了,缺少的引用根据自身项目更改

先定义一个枚举基类importcomfasterxmljacksondatabindannotationJsonDeserialize;importcomfasterxmljacksondatabin
前言在Java开发中我们为了避免过多的魔法值,使用枚举类来封装一些静态的状态代码。但是在将这些枚举的意思正确而全面的返回给前端却并不是那么顺利,我们通常会使用Jackson类库序列对象为JSON
Jackson序列序列Json数据Web技术发展的今天,Json和XML已经成为了web数据的事实标准,然而这种格式化的数据手工解析又非常麻烦,软件工程界永远不缺少工具,每当有需求的时候就会出
JSON(全称为JavaScriptObjectNotation)是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。JSON采用完全独立于语言的文本格式,可以很容易在各种网
简单的说下什么是序列序列1、把对象转换为字符串的过程称为对象的序列。2、把字符串恢复为对象的过程称为对象的序列。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数
ackagemainimport(encoding/jsonfmtreflect)typejsstruct{Namestring`json:name`Ageint`json:age`}funcstr
方法一:引入SystemWebScriptSerialization命名空间使用JavaScriptSerializer类实现简单的序列序列类:Personnel代码如下:publicclassP
序列化是将对象转化为字节序列的过程。方便在网络上传输https://wwwcnblogscom/cjh9551/p/10265613html1参数的序列2业务逻辑的实现,可以在这里使用ao的相关代
代码如下:///<summary>///Json序列,用于发送到客户端///</summary>publicstaticstringToJsJson(thisobjecti
Go使用json包的Marshal和Unmarshal进行json序列序列json序列://定义结构体typeCatstruct{NamestringAgeint8}//序列c:Ca