Java Spring JSON序列化枚举为自定义字符串实现方案
问题原因
Spring接口返回JSON时默认使用Jackson完成序列化操作,内置枚举序列化规则默认输出枚举的name()值(也就是你看到的SAMPLE)。之前尝试的两种方案不生效的核心原因:
- 重写
toString():Jackson默认序列化枚举不会主动调用枚举的toString()方法 - 自定义Spring Converter:这类转换器仅处理请求入参的类型转换(比如前端传的字符串参数转枚举对象),完全不参与响应JSON的序列化流程。
实现方案
根据业务场景二选一即可:
方案1:单个枚举自定义(无侵入、最简便)
在枚举中返回自定义字符串的方法上添加@JsonValue注解,Jackson序列化枚举时会直接取该方法的返回值作为输出结果,不需要额外全局配置。
修改后的枚举代码:
import com.fasterxml.jackson.annotation.JsonValue; public enum MyEnum { SAMPLE("sample"), OTHER_SAMPLE("other sample"); private final String name; MyEnum(String name) { this.name = name; } @JsonValue public String getCustomValue() { return this.name; } }
修改后重启服务,接口返回结果就是期望的["sample"]。
方案2:全局统一枚举序列化规则
如果项目中所有枚举都需要按自定义规则输出(比如统一使用toString()的返回值作为序列化结果),可以全局修改Jackson的序列化配置,不需要逐个枚举加注解。
添加如下配置类:
import com.fasterxml.jackson.databind.SerializationFeature; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilderCustomizer; @Configuration public class JacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer enumCustomizer() { // 全局配置:枚举序列化时调用toString()方法获取返回值 return builder -> builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); } }
配置生效后,你之前在枚举中重写的toString()逻辑就会在序列化时自动执行,所有枚举都会按toString()的返回值输出。
注意:如果项目手动替换了默认的JSON序列化框架为Fastjson/Gson,需要对应调整对应框架的枚举序列化配置,以上方案为Spring默认集成Jackson场景下的标准实现。
内容的提问来源于stack exchange,提问作者Andrew Mascillaro
相关产品推荐
相关产品推荐

