在Java开发中咱们为了不过多的魔法值,使用枚举类来封装一些静态的状态代码。可是在将这些枚举的意思正确而全面的返回给前端却并非那么顺利,咱们一般会使用Jackson类库序列化对象为JSON,今天就来说一个关于使用Jackson序列化枚举的通用性技巧。前端
为了便于统一处理和规范统一的风格,建议指定一个统一的抽象接口,例如:java
/** * The interface Enumerator. */ public interface Enumerator { /** * Code integer. * * @return the integer */ Integer code(); /** * Description string. * * @return the string */ String description(); }
咱们来写一个实现来标识性别:app
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; } }
若是咱们直接使用Jackson对枚举进行序列化,将只能简单的输出枚举的String
名称:ide
@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
来实现这种个性化需求:ui
// 声明一个简单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);
而后再次执行就会获取咱们指望的结果。然而这并不算合理。this
在Spring Boot应用中咱们但愿能全局配置。Spring Boot的自动配置为咱们提供了一个个性化定制ObjectMapper
的可能性,你只须要声明一个Jackson2ObjectMapperBuilderCustomizer
并注入Spring IoC:spa
@Bean public 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.code()); gen.writeStringField("description",value.description()); gen.writeEndObject(); } }); }
这样就实现了全局配置。code
这里咱们介绍了如何定制Jackson库以达到对枚举进行更加友好的序列化的目的。其实不仅仅枚举,你也能够实现其它序列化,反序列化,时间输出格式的定制。这些特性留给你本身挖掘。多多关注:码农小胖哥 获取更多开发技巧。对象
关注公众号:Felordcn 获取更多资讯
blog