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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:09:03