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

如何在Jackson反序列化时为POJO的inputStatus字段设置原始枚举值

解决Jackson反序列化时保留枚举原始值的问题

方案一:通过@JsonCreator构造器处理

直接在Report类中添加带@JsonCreator注解的构造器,接收原始的status字符串,手动完成枚举转换并给inputStatus赋值:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public enum Status {
    Success,
    Failure,
    @JsonEnumDefaultValue
    Unknown
}

public class Report {
    Status status;
    String inputStatus;

    // 反序列化专用构造器
    @JsonCreator
    public Report(@JsonProperty("status") String statusStr) {
        this.inputStatus = statusStr;
        try {
            this.status = Status.valueOf(statusStr);
        } catch (IllegalArgumentException e) {
            // 匹配不到枚举值时设为Unknown,和@JsonEnumDefaultValue效果一致
            this.status = Status.Unknown;
        }
    }

    // 若需序列化或其他场景,添加无参构造器
    public Report() {}

    // getter、setter方法
    public Status getStatus() { return status; }
    public void setStatus(Status status) { this.status = status; }
    public String getInputStatus() { return inputStatus; }
    public void setInputStatus(String inputStatus) { this.inputStatus = inputStatus; }
}

方案二:自定义Report类反序列化器

如果需要保留@JsonEnumDefaultValue的原生逻辑(比如枚举在其他地方复用该注解),可以给Report类编写自定义反序列化器,利用Jackson上下文处理枚举转换:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import java.io.IOException;

public enum Status {
    Success,
    Failure,
    @JsonEnumDefaultValue
    Unknown
}

@JsonDeserialize(using = ReportDeserializer.class)
public class Report {
    Status status;
    String inputStatus;

    // getter、setter方法
    public Status getStatus() { return status; }
    public void setStatus(Status status) { this.status = status; }
    public String getInputStatus() { return inputStatus; }
    public void setInputStatus(String inputStatus) { this.inputStatus = inputStatus; }
}

class ReportDeserializer extends StdDeserializer<Report> {
    private static final long serialVersionUID = 1L;

    public ReportDeserializer() {
        super(Report.class);
    }

    @Override
    public Report deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonNode rootNode = p.getCodec().readTree(p);
        Report report = new Report();

        // 获取原始status字符串
        String rawStatus = rootNode.get("status").asText();
        report.setInputStatus(rawStatus);

        // 利用Jackson原生逻辑处理枚举转换(自动应用@JsonEnumDefaultValue)
        Status status = ctxt.readValue(rootNode.get("status").traverse(p.getCodec()), Status.class);
        report.setStatus(status);

        return report;
    }
}

验证结果

当输入JSON为:

{
   "status": "garbage"
}

反序列化后的Report实例会符合预期:

  • status字段值为Status.Unknown
  • inputStatus字段值为"garbage"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:22:26