JSON類庫Jackson優雅序列化Java列舉類
阿新 • • 發佈:2020-06-22
![](https://img2020.cnblogs.com/other/1739473/202006/1739473-20200622091327990-378502082.png)
## 1. 前言
在**Java**開發中我們為了避免過多的魔法值,使用列舉類來封裝一些靜態的狀態程式碼。但是在將這些列舉的意思正確而全面的返回給前端卻並不是那麼順利,我們通常會使用**Jackson**類庫序列化物件為**JSON**,今天就來講一個關於使用**Jackson**序列化列舉的通用性技巧。
## 2. 通用列舉正規化
為了便於統一處理和規範統一的風格,建議指定一個統一的抽象介面,例如:
```java
/**
* The interface Enumerator.
*/
public interface Enumerator {
/**
* Code integer.
*
* @return the integer
*/
Integer code();
/**
* Description string.
*
* @return the string
*/
String description();
}
```
我們來寫一個實現來標識性別:
```java
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`名稱:
```java
@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`來實現這種個性化需求:
```java
// 宣告一個簡單Module 物件
SimpleModule module = new SimpleModule();
// 給Module 新增一個序列化器
module.addSerializer(Enumerator.class, new JsonSe