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

使用Jackson序列化枚举时JSON输出大写不符合预期的问题求助

解决Jackson枚举序列化大写问题

问题原因

Jackson默认的枚举序列化逻辑会使用枚举常量的名称(如RIGHT),而不会自动识别JAXB的@XmlEnumValue注解,因此导致JSON输出为大写形式。

解决方案一:使用Jackson的@JsonValue注解

修改枚举类,添加@JsonValue注解指定序列化时输出的字符串值:

@XmlType
@XmlEnum(String.class)
public enum HandDrive {

    @XmlEnumValue("right")
    RIGHT("right"),

    @XmlEnumValue("left")
    LEFT("left");

    private final String value;

    HandDrive(String value) {
        this.value = value;
    }

    @JsonValue
    public String getValue() {
        return value;
    }
}

@JsonValue注解会告诉Jackson在序列化枚举时,返回该方法的结果作为JSON值,这样就能输出right/left的小写形式。

解决方案二:注册Jackson JAXB注解模块

如果希望保留现有JAXB注解且不修改枚举类,可以通过注册Jackson的JAXB注解模块来让Jackson识别@XmlEnumValue:

  1. 首先添加依赖(以Maven为例):
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-jaxb-annotations</artifactId>
    <version>对应你的Jackson版本</version>
</dependency>
  1. 在创建ObjectMapper时注册该模块:
ObjectMapper mapper = new ObjectMapper();
// 注册JAXB注解模块
mapper.registerModule(new JaxbAnnotationModule());
mapper.setSerializationInclusion(Include.NON_NULL);

// 后续序列化代码不变
Car c = new Car();
c.setHandDrive(HandDrive.RIGHT);
try {
    String jsonString = mapper.writeValueAsString(c);
    System.out.println(jsonString);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}

这样Jackson会读取@XmlEnumValue指定的值进行序列化,输出符合预期的小写形式。

内容的提问来源于stack exchange,提问作者sensen ol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:55:06