有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Jackson自定义枚举常量名称

我有一个枚举定义为

public enum Locale {
  EN_US, ES_MX
}

但是,这些区域设置是以小写字符串形式编写的,在数据中连字符为en-uses-mx

有没有办法将这些小写字符串映射到相应的枚举常量?像en-usEN_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) 个答案

  1. # 1 楼答案

    由于Jackson 2.6,您可以用@JsonProperty注释enum常量,给它们一个自定义名称。{a2}州

    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
    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已经提供了一种常用的^{}类型。考虑重命名类。