实体类中嵌套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":"男"}
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |