如何在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.UnknowninputStatus字段值为"garbage"
内容的提问来源于stack exchange,提问作者user1692342
相关产品推荐
相关产品推荐

