实体类中嵌套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":"男"}
标签:实体类,String,Enum,sexName,private,sex,JSON,SexEnum,public
From: https://www.cnblogs.com/letfly/p/17467762.html