Jackson優(yōu)雅序列化Java枚舉類(lèi)過(guò)程解析
1. 前言
在Java開(kāi)發(fā)中我們?yōu)榱吮苊膺^(guò)多的魔法值,使用枚舉類(lèi)來(lái)封裝一些靜態(tài)的狀態(tài)代碼。但是在將這些枚舉的意思正確而全面的返回給前端卻并不是那么順利,我們通常會(huì)使用Jackson類(lèi)庫(kù)序列化對(duì)象為JSON,今天就來(lái)講一個(gè)關(guān)于使用Jackson序列化枚舉的通用性技巧。
2. 通用枚舉范式
為了便于統(tǒng)一處理和規(guī)范統(tǒng)一的風(fēng)格,建議指定一個(gè)統(tǒng)一的抽象接口,例如:
/**
* The interface Enumerator.
*/
public interface Enumerator {
/**
* Code integer.
*
* @return the integer
*/
Integer code();
/**
* Description string.
*
* @return the string
*/
String description();
}
我們來(lái)寫(xiě)一個(gè)實(shí)現(xiàn)來(lái)標(biāo)識(shí)性別:
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對(duì)枚舉進(jìn)行序列化,將只能簡(jiǎn)單的輸出枚舉的String名稱(chēng):
@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定制化一個(gè)Module來(lái)實(shí)現(xiàn)這種個(gè)性化需求:
// 聲明一個(gè)簡(jiǎn)單Module 對(duì)象
SimpleModule module = new SimpleModule();
// 給Module 添加一個(gè)序列化器
module.addSerializer(Enumerator.class, new JsonSerializer<Enumerator>() {
@Override
public void serialize(Enumerator value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
// 開(kāi)始寫(xiě)入對(duì)象
gen.writeStartObject();
// 分別指定 k v code description
gen.writeNumberField("code",value.code());
gen.writeStringField("description",value.description());
// 顯式結(jié)束操作
gen.writeEndObject();
}
});
// 注冊(cè) Module
objectMapper.registerModule(module);
然后再次執(zhí)行就會(huì)獲取我們期望的結(jié)果。然而這并不算合理。
4. Spring Boot 中自動(dòng)全局配置
在Spring Boot應(yīng)用中我們希望能全局配置。Spring Boot的自動(dòng)配置為我們提供了一個(gè)個(gè)性化定制ObjectMapper的可能性,你只需要聲明一個(gè)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();
}
});
}
這樣就實(shí)現(xiàn)了全局配置。
5. 總結(jié)
這里我們介紹了如何定制Jackson庫(kù)以達(dá)到對(duì)枚舉進(jìn)行更加友好的序列化的目的。其實(shí)不單單枚舉,你也可以實(shí)現(xiàn)其它序列化,反序列化,時(shí)間輸出格式的定制。這些特性留給你自己挖掘。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot的FailureAnalyzer機(jī)制及如何解救應(yīng)用啟動(dòng)危機(jī)
本文探討了FailureAnalyzer工具,它不僅能幫助我們快速識(shí)別和處理代碼中的錯(cuò)誤,還能極大地提升我們的開(kāi)發(fā)效率,通過(guò)詳細(xì)的實(shí)例分析,我們了解了FailureAnalyzer如何通過(guò)自定義邏輯應(yīng)對(duì)不同類(lèi)型的異常,讓程序員能夠更好地定位問(wèn)題并迅速找到解決方案,感興趣的朋友一起看看吧2025-01-01
idea 實(shí)現(xiàn)搜索jdk中的類(lèi)和包操作
這篇文章主要介紹了idea 實(shí)現(xiàn)搜索jdk中的類(lèi)和包操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
SpringBoot+Redis+Lua防止IP重復(fù)防刷攻擊的方法
本文主要介紹了SpringBoot+Redis+Lua防止IP重復(fù)防刷攻擊的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Struts2學(xué)習(xí)教程之Action類(lèi)如何訪(fǎng)問(wèn)WEB資源
這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)教程之Action類(lèi)如何訪(fǎng)問(wèn)WEB資源的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
Java實(shí)現(xiàn)兩人五子棋游戲(七) 屏幕提示信息
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,屏幕提示游戲信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Spring Security代碼實(shí)現(xiàn)JWT接口權(quán)限授予與校驗(yàn)功能
本文給大家介紹Spring Security代碼實(shí)現(xiàn)JWT接口權(quán)限授予與校驗(yàn)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-12-12
一文深入了解Java中的AtomicInteger類(lèi)
AtomicInteger是java并發(fā)包下面提供的原子類(lèi),主要操作的是int類(lèi)型的整型,通過(guò)調(diào)用底層Unsafe的CAS等方法實(shí)現(xiàn)原子操作,這篇文章主要給大家介紹了關(guān)于如何通過(guò)一文深入了解Java中AtomicInteger類(lèi)的相關(guān)資料,需要的朋友可以參考下2024-02-02
Java代碼統(tǒng)計(jì)網(wǎng)站中不同省份用戶(hù)的訪(fǎng)問(wèn)數(shù)
這篇文章主要介紹了Java代碼統(tǒng)計(jì)網(wǎng)站中不同省份用戶(hù)的訪(fǎng)問(wèn)數(shù) 的相關(guān)資料,非常具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05

