java使用Jackson自定义枚举常量名称
我有一个枚举定义为
public enum Locale {
EN_US, ES_MX
}
但是,这些区域设置是以小写字符串形式编写的,在数据中连字符为en-us
和es-mx
有没有办法将这些小写字符串映射到相应的枚举常量?像en-us
到EN_US
编辑 让我提供更多信息。我有一个以下类的对象
public class Song {
private Map<Locale, String> songName;
private int durationMillis;
}
歌曲的名称可能因地区而异。所以我在不同的地方为歌曲的名字创建了一个地图
我有一个包含歌曲信息的JSON文件。它是这样写的:
{
"songs": [
{
"songName": {"en-us":"Song name in US english", "es-mx": "Song name in Spanish"},
"durationMillis": 100000
},
{
"songName": {"en-us": "another song name - English"},
"durationMillis": 200000
}
]
}
我定义了另一个类
public class Songs {
private Set<Song> songs;
}
我使用FasterXml的ObjectMapper
将JSON作为Songs
类的对象加载
Songs songs = objectMapper.readValue(jsonStr, Songs.class);
这一行现在崩溃了,因为ObjectMapper
无法将en-us
字符串映射到Locale.EN_US
我总是可以编辑枚举并将其定义为
public enum Locale {
EN_US("en-us"),
ES_MX("es-mx");
private String value;
Locale(String val){
value = val;
}
}
但我在某处看到了一种更聪明的方法,它将小写连字号字符串转换为大写下划线文字。你能给我指出那个解决办法吗
我需要一个解决方案,使FasterXml的ObjectMapper
可以将字符串映射到enum
# 1 楼答案
由于Jackson 2.6,您可以用
@JsonProperty
注释enum常量,给它们一个自定义名称。{a2}州在你的情况下,你会使用
或者,假设所有枚举常量都遵循相同的命名模式,可以使用^{} 。在枚举类型中定义一个用
@JsonValue
注释的实例方法,并用命名策略实现它。比如你从中受益匪浅
它将用于序列化和反序列化
避免使用JDK中已经出现的名称命名类型。Java已经提供了一种常用的^{} 类型。考虑重命名类。