JackSon序列化和反序列化枚举类型

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public enum TimeRangeEnum {
    Today("今天", "today"), Yesterday("昨天", "yesterday"),
    ThisWeek("本周", "thisWeek"), LastWeek("上周", "lastWeek"),
    ThisMonth("本月", "thisMonth"), LastMonth("上月", "lastMonth"),
    ThisSeason("本季", "thisSeason"), LastSeason("上季", "lastSeason"),
    ThisYear("本年", "thisYear"), LastYear("上年", "lastYear");

    TimeRangeEnum(String name, String value) {
        this.name = name;
        this.value = value;
    }

    @ApiModelProperty("日期范围中文名")
    @JsonProperty
    private final String name;
    @ApiModelProperty("日期范围搜索值")
    @JsonProperty
    private final String value;

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }

    /**
     * 两个参数,反序列时JackSon框架自动根据方法参数进行自动调用。需要与序列化后的json格式进行一一对应。
     */
    @JsonCreator
    public static TimeRangeEnum from(String name, String value) {
        for (TimeRangeEnum timeRangeEnum : values()) {
            if (timeRangeEnum.name.equals(name) && timeRangeEnum.value.equals(value)) {
                return timeRangeEnum;
            }
        }
        return null;
    }

    /**
     * 获得所有枚举类型到list
     */
    public static List<TimeRangeEnum> getAllToList() {
        List<TimeRangeEnum> list = new ArrayList<>();
        TimeRangeEnum[] values = values();
        Collections.addAll(list, values);
        return list;
    }

    @Configuration
    static class TimeRangeConfig {
        @Bean
        public Jackson2ObjectMapperBuilderCustomizer timeRangeEnumCustomizer() {
            return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializerByType(TimeRangeEnum.class, new JsonSerializer<TimeRangeEnum>() {
                @Override
                public void serialize(TimeRangeEnum timeRangeEnum, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                    gen.writeStartObject();
                    gen.writeStringField("name", timeRangeEnum.getName());
                    gen.writeStringField("value", timeRangeEnum.getValue());
                    gen.writeEndObject();
                }
            });
        }
    }
}

测试效果

序列化
[
        {
            "name": "今天",
            "value": "today"
        },
        {
            "name": "昨天",
            "value": "yesterday"
        },
        {
            "name": "本周",
            "value": "thisWeek"
        },
        {
            "name": "上周",
            "value": "lastWeek"
        },
        {
            "name": "本月",
            "value": "thisMonth"
        },
        {
            "name": "上月",
            "value": "lastMonth"
        },
        {
            "name": "本季",
            "value": "thisSeason"
        },
        {
            "name": "上季",
            "value": "lastSeason"
        },
        {
            "name": "本年",
            "value": "thisYear"
        },
        {
            "name": "上年",
            "value": "lastYear"
        }
    ]
反序列化

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值