使用 Jackson 将注释字符串转换为枚举值

Convert annotation string to enum value with Jackson

我有一个带有 @JsonProperty 注释的枚举:

public enum Type {
    @JsonProperty("Files")
    File,
    @JsonProperty("Folders")
    Folder,
}

我知道我可以反序列化 JSON 字符串 ({"fieldName":"Files"}) 来获取对象。但是有什么方法可以将@JsonProperty 中注释的字符串转换为 Jackson 的枚举值,例如:

String s = "Files"
Type t = jackson.valueOf(s); // Type.File

或者我可以做到这一点:

Type t = Type.File;
String s = jackson.toString(t); // "Files"

我相信 private String value 可以解决这个问题,但是代码会有重复的常量(太多的“文件”和“文件夹”)。我想知道 Jackson 或 Gson 是否有解决方案来实现这一点。

如果我对你的理解正确,那么也许这就是你要找的:

String annotationValueAsSTring = Type.class.getField(Type.File.name()) 
                         .getAnnotation(JsonProperty.class).value();

-- 已编辑 --

要从 @JsonProperty String 值中检索 Enum 值,则需要创建一个辅助方法:

public static <T extends Enum<T>> Optional<T> getEnumValueFromJsonProperty(Class<T> enumClass,
                                                                           String jsonPropertyValue) {
    Field[] fields = enumClass.getFields();
    return Arrays.stream(fields).filter(field -> field.getAnnotation(JsonProperty.class).value().equals(jsonPropertyValue)).map(field -> Enum.valueOf(enumClass, field.getName())).findFirst();
}

它应该在 ObjectMapper

的帮助下工作
Type t = new ObjectMapper().readValue("\"Files\"", Type.class);
System.out.println(Type.File.equals(t)); //"true"

请注意,字符串必须是有效的 JSON 字符串,因此它必须包含双引号。字符串内容不能是Files,而必须是"Files"

另一个方向:

Type t = Type.File;
new ObjectMapper().writeValue(System.out, t); // "Files"