Springboot Jackson优雅序列化Java枚举类

本文介绍了如何在Java开发中,特别是在SpringBoot应用中,利用Jackson库自定义序列化枚举类,以输出包含code和description的JSON格式,从而避免魔法值并提供更友好的前端交互。
摘要由CSDN通过智能技术生成

1. 前言

        在Java开发中我们为了避免过多的魔法值,使用枚举类来封装一些静态的状态代码。但是在将这些枚举的意思正确而全面的返回给前端却并不是那么顺利,我们通常会使用Jackson类库序列化对象为JSON,今天就来讲一个关于使用Jackson序列化枚举的通用性技巧。

2. 通用枚举范式

        为了便于统一处理和规范统一的风格,建议指定一个统一的抽象接口,例如:

public interface Enumerator {

  Integer code();

  String description();
}

        我们来写一个实现来标识性别:

public enum GenderEnum implements Enumerator {
 
  UNKNOWN(0, "未知"),
 
  MALE(1, "男"),
 
  FEMALE(2, "女");
 
  private final Integer code;
  private final String description;
 
  GenderEnum(Integer code, String description) {
    this.code = code;
    this.description = description;
  }
 
  @Override
  public Integer code() {
    return code;
  }
 
  @Override
  public String description() {
    return description;
  }
}

3. 序列化枚举

        如果我们直接使用Jackson对枚举进行序列化,将只能简单的输出枚举的String名称

        但是我们期望将GenderEnum.MALE 序列化为 {"code":1,"description":"男"} 。我们可以向ObjectMapper定制化一个Module来实现这种个性化需求:

// 声明一个简单Module 对象
 SimpleModule module = new SimpleModule();
  // 给Module 添加一个序列化器
  module.addSerializer(Enumerator.class, new JsonSerializer<Enumerator>() {
    @Override
    public void serialize(Enumerator value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
      // 开始写入对象
      gen.writeStartObject();
      // 分别指定 k v  code  description
      gen.writeNumberField("code",value.code());
      gen.writeStringField("description",value.description());
      // 显式结束操作
      gen.writeEndObject();
    }
  });
 
// 注册 Module
objectMapper.registerModule(module);

        然后再次执行就会获取我们期望的结果。然而这并不算合理。

4. Spring Boot 中自动全局配置

        Spring Boot应用中我们希望能全局配置。Spring Boot的自动配置为我们提供了一个个性化定制ObjectMapper的可能性,你只需要声明一个Jackson2ObjectMapperBuilderCustomizer并注入Spring IoC:

@Component
public class Jackson2ObjectEnumCustomizer {
    @Bean
    public org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer enumCustomizer(){
        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializerByType(Enumerator.class, new JsonSerializer<Enumerator>() {
            @Override
            public void serialize(Enumerator value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeStartObject();
                gen.writeNumberField("code",value.getCode());
                gen.writeStringField("msg",value.getMsg());
                gen.writeEndObject();
            }
        });
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值