栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Jackson优雅序列化Java枚举类过程解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Jackson优雅序列化Java枚举类过程解析

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名称:

  @Resource
  private ObjectMapper objectMapper;

  @Test
  void enumTest() {
    try {
      String s = objectMapper.writevalueAsString(GenderEnum.MALE);
      // 输出字符串 MALE
      System.out.println(s);
    } catch (JsonProcessingException e) {
      e.printStackTrace();
    }
  }

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

     // 声明一个简单Module 对象
     SimpleModule module = new SimpleModule();
      // 给Module 添加一个序列化器
      module.addSerializer(Enumerator.class, new JsonSerializer() {
 @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:

@Bean
public Jackson2ObjectMapperBuilderCustomizer enumCustomizer(){
  return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializerByType(Enumerator.class, new JsonSerializer() {
    @Override
    public void serialize(Enumerator value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
   gen.writeStartObject();
   gen.writeNumberField("code",value.code());
   gen.writeStringField("description",value.description());
   gen.writeEndObject();

    }
  });
}

这样就实现了全局配置。

5. 总结

这里我们介绍了如何定制Jackson库以达到对枚举进行更加友好的序列化的目的。其实不单单枚举,你也可以实现其它序列化,反序列化,时间输出格式的定制。这些特性留给你自己挖掘。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/132037.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号