Java Spring自定义Enum到JSON序列化中的字符串转换



我正在尝试将枚举值转换为自定义字符串,作为Java Spring应用程序中JSON响应的一部分。我试图覆盖枚举的toString方法并创建一个Spring转换器,但这两种尝试似乎都不起作用。

<<h3>样品控制器/h3>
@RequestMapping(value = "/test/endpoint", produces = APPLICATION_JSON_VALUE)
@RestController
public class RecommenderController {
...
@GetMapping("test")
public List<MyEnum> test() {
return new ArrayList<>() {{
this.add(MyEnum.SAMPLE);
}};
}
}

Enum

public enum MyEnum {
SAMPLE("sample"), OTHER_SAMPLE("other sample");
private final String name;
public MyEnum(String name) {
this.name = name;
}
public String toString() {
return this.name;
}
}

这段代码返回响应["SAMPLE"],尽管我希望它返回["sample"]。有没有办法在春天实现这个?

假设您正在使用默认的MappingJackson2HttpMessageConverter,那么在幕后您正在使用Jackson的ObjectMapper来执行所有JSON序列化和反序列化。所以这是一个为你的协议对象配置Jackson的问题。

在这种情况下,它可能是最直接的告诉Jackson,它可以用@JsonValue注释为你的MyEnum实例制作一个JSON值。

public enum MyEnum {
SAMPLE("sample"), OTHER_SAMPLE("other sample");
private final String name;
public MyEnum(String name) {
this.name = name;
}
@JsonValue
public String getValue() {
return this.name;
}
}

@JsonValue有一个好处,如其Javadoc中所述:

注意:当用于Java枚举时,一个额外的特性是注释方法返回的值也被认为是要反序列化的值,而不仅仅是要序列化的JSON字符串。这是可能的,因为枚举值的集合是恒定的,并且可以定义映射,但对于POJO类型一般不能这样做;因此,它不用于POJO反序列化。

如果你有相同的枚举定义在应用程序中接收列表,它将反序列化回你的Enum的人类可读价值。

这可以通过在枚举定义中使用@JsonValue注释来完成:

public enum MyEnum {
...
@JsonValue
public String getName() {
return this.name;
}
}

最新更新