首页 > 解决方案 > 如何从 REST API 的 JSON 请求中反序列化枚举字段的替代值?

问题描述

REST API 的请求模型有一个枚举字段:

public enum CommentContext {  
  STUDENT_FEEDBACK,
  STUDENT_QUESTION;
}

现在我想从枚举值中删除 STUDENT_ 前缀,但不会破坏 API 的现有调用者。

我尝试使用@JsonAlias,如下所示:

public enum CommentContext {
   @JsonAlias ("{FEEDBACK, STUDENT_FEEDBACK}")
   FEEDBACK,
   @JsonAlias ("{QUESTION, STUDENT_QUESTION}")
   COMMENT;
}

但是,当 STUDENT_FEEDBACK 作为请求 JSON 中该枚举字段的值传递时,API 因 400 Bad Request 而失败。

是否可以从 JSON 反序列化此 CommentContext 对象,以获取此枚举字段的任一替代值,例如 FEEDBACK 或 STUDENT_FEEDBACK?

标签: javaspringjackson2

解决方案


您可以使用@JsonCreator 来完成。在这里,我为您的问题提供了解决方案:

public enum CommentContext {
STUDENT_FEEDBACK,
STUDENT_QUESTION;

@JsonCreator
public static CommentContext setValue(String key){
    Optional<CommentContext> commentContext = Arrays.stream(CommentContext.values())
            .parallel()
            .filter(ct -> ct.toString().equals(key) || ct.toString().substring(8).equals(key))
            .findAny();
    return commentContext.orElse(null);
}
}

你也可以看到这个链接


推荐阅读