使用 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"
我有一个带有 @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"