想要在JSON中获取枚举值而不是名称

8

我有一个枚举类型:

public enum NotificationType {

    Store("S"),
    Employee("E"),
    Department("D"),
    All("A");

    public String value;

    NotificationType(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value;
    }

    @JsonCreator
    public static NotificationType fromValue(String value) {
        for (NotificationType type : NotificationType.values()) {
            if (type.value.equals(value)) {
                return type;
            }
        }
        throw new IllegalArgumentException();
    }
}

我创建了一个转换器,使得当枚举保存到数据库时,它将持久化值(S、E、D或A),而不是名称。我可以通过 POST json 将值发送给控制器,它可以正确地绑定到对象上。
然而,当我从 GET 渲染JSON时,它仍然显示名称(员工、商店等),但我希望它仍然显示值。

你标记了Jackson,但我不确定你使用的是哪个版本。我认为如果你在toString上方注释@JsonValue,它会将其用作枚举的值。或者你可以使用自定义序列化程序。 - Zircon
我会尝试使用@JsonValue并回报结果。谢谢! - Gregg
成功了!提交它作为答案,我会接受的。再次感谢。 - Gregg
只是好奇:你为什么想要这样做呢?如果你担心使用Store而不是S对你来说是个问题,难道你不认为JSON本身可能已经是个问题吗?比如说:“天哪,我不介意使用那个包含如此多开销的协议,但是我的枚举类型,在其中占用了太多字节?” - GhostCat
1
JSON 的优势不就是提供了与 XML 相同的数据,但以更小的格式呈现吗?如果在网络环境较差的情况下工作,最好将值尽可能地缩小。 - Zircon
这实际上与代码可读性以及客户对表示的需求有关。如果枚举中只有 E、S 等,那么必须有关于每个代表的文档。这种方式可以自我记录,并在需要时保持其他呈现选项的开放性。 - Gregg
1个回答

7

因为你的toString方法返回了你想要用来表示枚举的值,所以你可以使用@JsonValue注解来告诉Jackson返回值表示枚举的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接