Библиотека классов JSON. Джексон элегантно сериализует перечисляемые классы Java.

Spring Boot Java

1. Введение

существуетJavaВ процессе разработки, чтобы избежать слишком большого количества магических значений, мы используем классы перечисления для инкапсуляции некоторых статических кодов состояния. Однако правильно и исчерпывающе вернуть смысл этих перечислений на фронтенд не так уж и гладко, мы обычно используемJacksonБиблиотека классов сериализует объект какJSON, сегодня поговорим об использованииJacksonОбщий трюк для сериализации перечислений.

2. Общая парадигма перечисления

Чтобы облегчить унифицированную обработку и стандартизировать единый стиль, рекомендуется указать единый абстрактный интерфейс, например:

/**
 * The interface Enumerator.
 */
public interface Enumerator {
    /**
     * Code integer.
     *
     * @return the integer
     */
    Integer code();

    /**
     * Description string.
     *
     * @return the string
     */
    String description();
}

Давайте напишем реализацию для определения пола:

public enum GenderEnum implements Enumerator {
   
    UNKNOWN(0, "未知"),

    MALE(1, "男"),

    FEMALE(2, "女");


    private final Integer code;
    private final String description;

    GenderEnum(Integer code, String description) {
        this.code = code;
        this.description = description;
    }


    @Override
    public Integer code() {
        return code;
    }

    @Override
    public String description() {
        return description;
    }
}

3. Сериализация перечисления

Если мы непосредственно используемJacksonСериализация перечисления просто выведет перечислениеStringназвание:

    @Resource
    private ObjectMapper objectMapper;

    @Test
    void enumTest() {
        try {
            String s = objectMapper.writeValueAsString(GenderEnum.MALE);
            // 输出字符串 MALE
            System.out.println(s);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

мы ожидаемGenderEnum.MALEсериализовать в{"code":1,"description":"男"}. мы можемObjectMapperпользовательскийModuleДля достижения этой персонализированной потребности:

         // 声明一个简单Module 对象
         SimpleModule module = new SimpleModule();
           // 给Module 添加一个序列化器
            module.addSerializer(Enumerator.class, new JsonSerializer<Enumerator>() {
                @Override
                public void serialize(Enumerator value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                   // 开始写入对象
                    gen.writeStartObject();
                    // 分别指定 k v   code   description 
                    gen.writeNumberField("code",value.code());
                    gen.writeStringField("description",value.description());
                    // 显式结束操作
                    gen.writeEndObject();
                }
            });

        // 注册 Module
        objectMapper.registerModule(module);

Затем повторное выполнение даст ожидаемый результат. Однако это неразумно.

4. Автоматическая глобальная конфигурация в Spring Boot

существуетSpring BootВ приложении мы хотим иметь возможность настраивать его глобально.Spring BootАвтоматическая конфигурация предоставляет нам индивидуальную настройкуObjectMapperвозможности, вам нужно только объявитьJackson2ObjectMapperBuilderCustomizerи вводитьSpring IoC:

@Bean
public Jackson2ObjectMapperBuilderCustomizer enumCustomizer(){
    return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializerByType(Enumerator.class, new JsonSerializer<Enumerator>() {
        @Override
        public void serialize(Enumerator value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                    gen.writeStartObject();
                    gen.writeNumberField("code",value.code());
                    gen.writeStringField("description",value.description());
                    gen.writeEndObject();


        }
    });
}

На этом глобальная конфигурация завершена.

5. Резюме

Здесь мы описываем, как настроитьJacksonбиблиотека для более удобной сериализации перечислений. На самом деле, не только перечисление, вы также можете реализовать другую сериализацию, десериализацию и настройку форматов вывода времени. Эти функции оставлены вам, чтобы выкопать для себя. Уделять больше внимания:Код Фермер Маленький Толстый БратПолучите больше советов по развитию.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn