美文网首页json
枚举与json的序列化/反序列化

枚举与json的序列化/反序列化

作者: 百度一下啦 | 来源:发表于2020-03-24 19:50 被阅读0次

    在springboot项目中,对于一些规定,不会变化的状态字段(比如性别,订单状态,用户状态)可定义枚举规范字段的规则。当枚举作为字段时,在返回后我们往往只需要得到描述即可,并不需要对应的状态值(1-男;2-女),即想要得到的是男,而不是1。以下为我总结的一些方法

    枚举序列化json

    1. @ResponseBody(jackson)

    在描述字段get方法上添加@JsonValue即可(IEnum,@EnumValue为mybatis-plus中的内容,BaseEnum是自己写的

    public enum Sex implements IEnum<Integer>, BaseEnum {
    
        /**
         * 性别枚举
         */
        MAN(1,"男"),
        WOMAN(2,"女");
    
        @EnumValue
        private int value;
    
        private String desc;
    
        Sex(int value,String desc) {
            this.value = value;
            this.desc = desc;
        }
    
        @Override
        public Integer getValue() {
            return value;
        }
    
        @Override
        @JsonValue
        public String getDesc() {
            return desc;
        }
    }
    
    2.fastjson

    该种方法主要是处理统一json转换时,可能会遇到枚举字段的情况(下面的BaseEnum和上面列举的代码是一个
    首先需要实现ObjectSerializer,然后对枚举的处理使用的统一的BaseEnum(手写的接口

    public class BaseEnumSerializer implements ObjectSerializer {
    
        @Override
        public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException {
            jsonSerializer.write(((BaseEnum)o).getDesc());
        }
    }
    

    再在类中的枚举字段上加上@JSONField(serializeUsing = BaseEnumSerializer.class)即可

    public class User {
    
        @ApiModelProperty("姓名")
        private String name;
    
        @ApiModelProperty("性别;1-男;2-女;")
        @JSONField(serializeUsing = BaseEnumSerializer.class)
        private Sex sex;
    }
    
    3. 单个枚举字段(fastjson)转换
     public static void main(String[] args) throws Exception {
            Sex sex = Sex.MAN;
            SerializeConfig serializeConfig = new SerializeConfig();
            serializeConfig.configEnumAsJavaBean(Sex.class);
            JSONObject.toJSONString(sex,serializeConfig);
        }
    

    json字符串序列号枚举(@RequestBody)

    常用于有枚举字段的请求参数

    1.下标从0开始

    无需任何配置,即在枚举范围内即可

    2.不从0开始或无序(自定义)的状态值枚举

    继承JsonDeserializer,处理统一枚举接口(IEnum)

    public class IEnumDeSerializer extends JsonDeserializer<IEnum> {
    
        @Override
        public IEnum deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            JsonNode value = jsonParser.getCodec().readTree(jsonParser);
            String currentName = jsonParser.currentName();
            Object currentValue = jsonParser.getCurrentValue();
            Class findPropertyType = BeanUtils.findPropertyType(currentName, currentValue.getClass());
            if (findPropertyType.isEnum()) {
                IEnum[] enumConstants = (IEnum[]) findPropertyType.getEnumConstants();
                for (IEnum e : enumConstants) {
                    if (e.getValue().equals(value.asInt())) {
                        return e;
                    }
                }
            }
            return null;
        }
    }
    

    然后在类上字段加上注解@JsonDeserialize(using = IEnumDeSerializer.class)即可

    public class User {
    
        @ApiModelProperty("姓名")
        private String name;
    
        @ApiModelProperty("性别;1-男;2-女;")
        @JsonDeserialize(using = IEnumDeSerializer.class)
        private Sex sex;
    }
    

    大概就这样,可能讲的有点模糊。有问题再改吧。

    相关文章

      网友评论

        本文标题:枚举与json的序列化/反序列化

        本文链接:https://www.haomeiwen.com/subject/lnjayhtx.html