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获取更多资讯