Jackson XML序列化Java Enum输出枚举名而非自定义value问题
问题原因
你使用的Jackson XmlMapper默认序列化枚举时,会优先调用枚举原生的name()方法获取值,该方法返回的是你定义枚举常量时的大写字面量(比如OutputFormatEnum.PDF的name()返回值就是"PDF"),并不会自动读取你自定义的value字段,也不会默认使用你重写的toString()方法,因此出现序列化结果不符合预期的问题。
解决方案
方案1:通过注解指定序列化取值(推荐)
在枚举的getValue()方法上添加@JsonValue注解,Jackson序列化时会直接使用该方法的返回值作为枚举的序列化结果。如果需要支持反序列化,可在fromValue方法上添加@JsonCreator注解,代码示例如下:
public enum OutputFormatEnum { PDF("pdf"), DOCX("docx"), // 其余枚举常量保持不变... private String value; OutputFormatEnum(String value) { this.value = value; } @JsonValue // 新增注解,指定序列化时取该方法返回值 public String getValue() { return value; } @Override public String toString() { return String.valueOf(value); } @JsonCreator // 新增注解,指定反序列化时用该方法匹配枚举值 public static OutputFormatEnum fromValue(String value) { for (OutputFormatEnum b : OutputFormatEnum.values()) if (b.value.equals(value)) return b; throw new IllegalArgumentException("Unexpected value '" + value + "'"); } }
方案2:全局配置XmlMapper特性
如果不想修改枚举类代码,可在初始化XmlMapper时开启WRITE_ENUMS_USING_TO_STRING配置,让Jackson序列化枚举时使用你重写的toString()方法的返回值:
XmlMapper xmlMapper = new XmlMapper(); // 序列化时使用枚举的toString()返回值 xmlMapper.enable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_ENUMS_USING_TO_STRING); // 若需要支持反序列化,额外加以下配置 xmlMapper.enable(com.fasterxml.jackson.databind.DeserializationFeature.READ_ENUMS_USING_TO_STRING);
内容的提问来源于stack exchange,提问作者zaidabuhijleh
相关产品推荐
相关产品推荐

