使用 jackson 反序列化 EnumMap

Deserializaing EnumMap using jackson

我已将 @JsonAnySetter 注释添加到 addProperty 方法

Map<MyEnum, String> mymap = new EnumMap<>(MyEnum.class);

@JsonAnySetter
public void addProperty(MyEnum key, Object value) {
    mymap.put(key, value);
}

但是在反序列化时出现以下错误

com.fasterxml.jackson.databind.JsonMappingException: Invalid 'any-setter' annotation on method 'addProperty()': first argument not of type String or Object, but java.lang.Enum

如果我将映射更改为具有 String 类型键的简单 HashMap,则它可以正常工作。

有人可以让我知道反序列化为 EnumMap 需要做什么吗

文档指出:

第一个参数是 属性 的名称,因此它必须是字符串。

您可以在您的设置方法中将其转换为枚举。

@JsonAnySetter 注释似乎只适用于 StringObject 键类型。

我找到的解决方法是重载addProperty方法,键类型为String,然后将String键转换为Enum类型,并用Enum键调用addProperty方法。

在重载方法上使用 @JsonAnySetter 注释。

Map<MyEnum, String> mymap = new EnumMap<>(MyEnum.class);

public void addProperty(MyEnum key, Object value) {
    mymap.put(key, value);
}

@JsonAnySetter
private void addProperty(String key, Object value) {
    addProperty(MyEnum.valueOf(key), value);
}

请注意,我已经重载了 addProperty 方法 private,因为我不想公开此方法版本。

@JsonAnySetter 注释似乎适用于 private 方法。