## 實體類中嵌套Enum類型並想轉換成JSON字元串時遇到的問題。 先說明問題的產生,在自己寫著玩的時候,新建了一個**User**類如下: ```java package com.ma.xdo; import lombok.*; import java.io.Serializable; /** ...
實體類中嵌套Enum類型並想轉換成JSON字元串時遇到的問題。
先說明問題的產生,在自己寫著玩的時候,新建了一個User類如下:
package com.ma.xdo;
import lombok.*;
import java.io.Serializable;
/**
* @ClassName User
* @Description TODO
* @Author @O_o
* @Date 2023/6/8 14:24
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {
private String name;
private Integer age;
private SexEnum sex;
}
不難看出User類中,用到了枚舉類把性別規定成了兩個。
下麵是SexEnum類:
public enum SexEnum {
MALE(1, "男"),
FEMALE(2, "女");
private Integer sex;
private String sexName;
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getSexName() {
return sexName;
}
public void setSexName(String sexName) {
this.sexName = sexName;
}
SexEnum(Integer sex, String sexName) {
this.sex = sex;
this.sexName = sexName;
}
}
這裡,當我想通過工具類將其轉換成json字元串並且讓枚舉中的 值能返回對應的文字時,出現了問題。返回的值是枚舉類的 屬性名 而不是對應的值
{"age":19,"name":"李四","sex":"MALE"}
(寫到這裡,我也不知道是否在企業開發中有這種需求。但是就當學習了一種工具的使用方法了)
於是,通過資料的查詢,當前使用的環境是fastJson,fastJson提供了自定義序列化的介面ObjectSerializer,實現這個介面, 需要重寫其提供的一個方法
public class SexEnumSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException {
// TODO 這裡固定要自定義的轉換類型就好
}
}
由於這個介面是一個函數式介面,於是我乾脆用到了lambda表達式 實現流程如下
//聲明出一個配置對象
SerializeConfig config = new SerializeConfig();
//把自定義的序列化方式,當接到的這個值 包含 sexEnum這個類型屬性的時候 會替換其sex中的對應值
config.put(SexEnum.class, (JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i)->{
if (o instanceof SexEnum) {
SexEnum sexEnum = (SexEnum) o;
jsonSerializer.write(sexEnum.getSexName());
} else {
jsonSerializer.write(o);
}
});
String json = JSON.toJSONString(user, config);
由此 解決了此次遇到的問題。成功輸出
{"age":19,"name":"李四","sex":"男"}