Jackson枚举序列化与反序列化:如何优雅地处理枚举的JSON转换?

Jackson库中枚举的JSON序列化和反序列化

Jackson 1.9.9 版本及以上版本处理枚举的JSON序列化相对简单,可以使用@JsonValue注解实现序列化为JSON字符串。然而,反序列化则需要额外处理。

独立解决方案:利用@JsonCreator@JsonValue注解

一种常用的方法是结合@JsonCreator@JsonValue注解:

public enum Event {

    FORGOT_PASSWORD("forgot password");

    private static Map namesMap = new HashMap<>();

    static {
        namesMap.put("forgot password", FORGOT_PASSWORD);
    }

    @JsonCreator
    public static Event forValue(String value) {
        return namesMap.get(value.toLowerCase());
    }

    @JsonValue
    public String toValue() {
        return value;
    }

    private final String value;

    Event(String value) {
        this.value = value;
    }
}

此方案通过namesMap映射JSON字符串和枚举值,@JsonCreator注解的forValue方法负责反序列化,@JsonValue注解的toValue方法负责序列化。

解决方案的不足

这种独立解决方案需要在每个枚举类中重复编写类似代码,导致代码冗余,不利于维护。 更通用的解决方案,例如自定义序列化器或反序列化器,可以避免这种重复。