使用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:
- 首先添加依赖(以Maven为例):
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>对应你的Jackson版本</version> </dependency>
- 在创建
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
相关产品推荐
相关产品推荐

