使用 Jackson 使用静态工厂方法反序列化枚举

Deserialising an Enum with a static factory method using Jackson

如果无法更改枚举的源代码,如何使用静态工厂方法反序列化枚举?

例如,如何将 Jackson 配置为使用 MyEnum.fromKey() 进行反序列化?

public enum MyEnum {
  FOO("key1"),
  BAR("key2");

  private final String key;

  MyEnum(String key) {
    this.key = key;
  }

  public static final MyEnum fromKey(String key) {
     // lookup by MyEnum.key
  }

使用 Jackson mixin 提供一个 @JsonCreator 委托给 MyEnum.fromKey():

public enum MyEnumMixIn {
  /* no values */;

  @JsonCreator
  public static MyEnum fromKey(String key) {
    return MyEnum.fromKey(key);
  }
}

ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(MyEnum.class, MyEnumMixIn.class);