【问题标题】:How to deserialize enum with Jackson (2.13.1)如何使用 Jackson (2.13.1) 反序列化枚举
【发布时间】:2022-02-07 15:37:36
【问题描述】:

我想用 Jackson 2.13.1 反序列化一个枚举。

我找到了以下solution

public enum Type {
    TYPEONE("Type1");

    private static Map<String, Type> typesMap = new HashMap<>(1);

    static {
        typesMap.put("type1", TYPEONE);
    }

    @JsonCreator
    public static Type forValue(String value) {
        return typesMap.get(value.toLowerCase());
    }

    private final String label;

    Type(String label) {
        this.label = label;
    }

    @JsonValue
    public String getLabel() {
        return label;
    }
}

仍然出现以下错误:

java.lang.IllegalArgumentException: No enum constant com.cas.cascrt.certificate.model.enums.Type.Type1
at java.base/java.lang.Enum.valueOf(Enum.java:266) ~[na:na]

【问题讨论】:

标签: java spring spring-boot enums jackson


【解决方案1】:

您不需要维护地图。在@JsonCreator 方法流中通过Type.values(),过滤传入的值并返回枚举。

【讨论】:

    【解决方案2】:

    您的错误似乎是由拼写错误引起的:
    而不是typesMap.put("type1", TYPEONE);
    它应该是 typesMap.put("Type1", TYPEONE); 以匹配 TYPEONE("Type1");


    但无论如何:使用@JsonCreator@JsonValueMap 用于从自定义字符串反序列化/序列化枚举 有点矫枉过正。

    只需在枚举常量上使用@JsonProperty,就可以简单得多。

    public enum Type {
        @JsonProperty("Type1")
        TYPEONE,
    
        @JsonProperty("Type2")
        TYPETWO,
    
        @JsonProperty("Type3")
        TYPETHREE;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2014-07-16
      • 2020-07-17
      • 2011-12-07
      相关资源
      最近更新 更多