You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:06:18