物體類中嵌套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":"男"}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554672.html
標籤:其他
上一篇:Rust語言 - 介面設計的建議之不意外(unsurprising)
下一篇:返回列表
