实体类中嵌套Enum类型并想转换成JSON字符串时遇到的问题。 ...

打印 上一主题 下一主题

主题 996|帖子 996|积分 2988

实体类中嵌套Enum类型并想转换成JSON字符串时遇到的问题。

先说明问题的产生,在自己写着玩的时候,新建了一个User类如下:
  1. package com.ma.xdo;
  2. import lombok.*;
  3. import java.io.Serializable;
  4. /**
  5. * @ClassName User
  6. * @Description TODO
  7. * @Author @O_o
  8. * @Date 2023/6/8 14:24
  9. * @Version 1.0
  10. */
  11. @Data
  12. @AllArgsConstructor
  13. @NoArgsConstructor
  14. @Builder
  15. public class User implements Serializable {
  16.     private String name;
  17.     private Integer age;
  18.     private SexEnum sex;
  19. }
复制代码
不难看出User类中,用到了枚举类把性别规定成了两个。
下面是SexEnum类:
  1. public enum SexEnum {
  2.     MALE(1, "男"),
  3.     FEMALE(2, "女");
  4.     private Integer sex;
  5.     private String sexName;
  6.     public Integer getSex() {
  7.         return sex;
  8.     }
  9.     public void setSex(Integer sex) {
  10.         this.sex = sex;
  11.     }
  12.     public String getSexName() {
  13.         return sexName;
  14.     }
  15.     public void setSexName(String sexName) {
  16.         this.sexName = sexName;
  17.     }
  18.     SexEnum(Integer sex, String sexName) {
  19.         this.sex = sex;
  20.         this.sexName = sexName;
  21.     }
  22. }
复制代码
这里,当我想通过工具类将其转换成json字符串并且让枚举中的 值能返回对应的文字时,出现了问题。返回的值是枚举类的  属性名 而不是对应的值
  1. {"age":19,"name":"李四","sex":"MALE"}
复制代码
(写到这里,我也不知道是否在企业开发中有这种需求。但是就当学习了一种工具的使用方法了)
于是,通过资料的查询,当前使用的环境是fastJson,fastJson提供了自定义序列化的接口ObjectSerializer,实现这个接口, 需要重写其提供的一个方法
  1. public class SexEnumSerializer implements ObjectSerializer {
  2.     @Override
  3.     public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException {
  4.                 // TODO 这里固定要自定义的转换类型就好
  5.     }
  6. }
复制代码
由于这个接口是一个函数式接口,于是我干脆用到了lambda表达式 实现流程如下
  1. //声明出一个配置对象
  2. SerializeConfig config = new SerializeConfig();
  3. //把自定义的序列化方式,当接到的这个值 包含 sexEnum这个类型属性的时候  会替换其sex中的对应值
  4. config.put(SexEnum.class, (JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i)->{
  5.     if (o instanceof SexEnum) {
  6.         SexEnum sexEnum = (SexEnum) o;
  7.         jsonSerializer.write(sexEnum.getSexName());
  8.     } else {
  9.         jsonSerializer.write(o);
  10.     }
  11. });
  12. String json = JSON.toJSONString(user, config);
复制代码
由此 解决了此次遇到的问题。成功输出
  1. {"age":19,"name":"李四","sex":"男"}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表