实体类中嵌套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.cnblogs.com/letfly/p/17467762.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!