【问题标题】:Enum, How to rename during (de)serialization?枚举,如何在(反)序列化期间重命名?
【发布时间】:2018-10-04 14:25:23
【问题描述】:

您好,是否可以在 Java 中更改 ENUM 的名称? 例如,我有枚举 -

public enum CloudType {
    AZURE, OPENSTACK
}

还有一个班级——

public class Env{
   private CloudType cloudType;
}

在 JACKSON 解析期间,如果我给出 -

{
  "cloudType":"AZURE"
}

或者

{
  "cloudType":"azure"
}

它会给我一个带有cloudType=AZUREEnv 对象?

有一个线程(Jackson databind enum case insensitive),但我们真的需要做这么多吗? 或者

@XmlEnumValue("azure")
    AZURE("azure"),

够了吗?

【问题讨论】:

  • 你为什么不简单地尝试一下?
  • 这不会改变枚举的名称,是吗?它只是为枚举变量赋值。
  • tl;博士:MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS
  • 实际上我是直接从 REST 请求体进行序列化,它能够同时处理 Json 和 XML

标签: java jackson


【解决方案1】:

您可以将 enum 实例的 Java 名称与其 JSON 表示分离。

您应该在您的enum CloudType 中添加一个@JsonValue-annotated 方法来告诉Jackson 在读取/写入JSON 时使用哪个值。 为此,您还需要一个构造函数来初始化此值。

像这样:

public enum CloudType {
    AZURE("azure"),
    OPENSTACK("openstack");

    private final String value;

    private CloudType(String value) {
        this.value = value;
    }

    @JsonValue
    public String getValue() {
        return value;
    }
}

然后杰克逊会将CloudType.AZURE序列化为"azure"
并将"azure"反序列化为CloudType.AZURE

【讨论】:

    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2015-07-26
    相关资源
    最近更新 更多