我是靠谱客的博主 勤恳流沙,最近开发中收集的这篇文章主要介绍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>

最后

以上就是勤恳流沙为你收集整理的java 枚举 命名_关于Java:使用Jackson自定义枚举常量名称的全部内容,希望文章能够帮你解决java 枚举 命名_关于Java:使用Jackson自定义枚举常量名称所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部