java 枚举 命名_关于Java:使用Jackson自定义枚举常量名称

我有一个枚举定义为

public enum Locale {

EN_US, ES_MX

}

但是,这些语言环境被写为小写字符串,在数据中连字符为en-us和es-mx。

有没有办法将这些小写字符串映射到相应的枚举常量?像en-us到EN_US一样?

编辑

让我提供更多信息。我有以下课程的对象。

public class Song {

private Map 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 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可以将字符串映射到枚举。

Java枚举中Override valueof()和toString()的可能重复项

@jhamon:它不是重复的。 我在调用已定义枚举的特定方法时没有灵活性。 我不知道Jacksons ObjectMapper会调用什么方法。 它可能仅适用于构造函数。

从Jackson 2.6开始,您可以使用@JsonProperty注释枚举常量,以为其指定自定义名称。 Javadoc状态

Starting with Jackson 2.6 this annotation may also be used to change

serialization of Enum like so:

public enum MyEnum {

@JsonProperty("theFirstValue") THE_FIRST_VALUE,

@JsonProperty("another_value") ANOTHER_VALUE;

}

就您而言,您将使用

public enum Locale {

@JsonProperty("en-us") EN_US, @JsonProperty("es-mx") ES_MX

}

另外,假设所有枚举常量都遵循相同的命名模式,则可以使用@JsonValue。 在您的枚举类型中定义一个用@JsonValue注释的实例方法,并使用命名策略来实现它。 例如,

@JsonValue

public String forJackson() {

return name().toLowerCase().replace('_', '-');

}

您得到的好处

when use for Java enums, one additional feature is that value returned

by annotated method is also considered to be the value to deserialize

from, not just JSON String to serialize as. This is possible since set

of Enum values is constant and it is possible to define mapping, but

can not be done in general for POJO types; as such, this is not used

for POJO deserialization.

它将同时用于序列化和反序列化。

避免使用已经在JDK中出现的名称来命名您的类型。 Java已经提供了常用的Locale类型。 考虑重命名您的班级。

sub>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值