【问题标题】:Jackson deserialize "simple type" to enum杰克逊将“简单类型”反序列化为枚举
【发布时间】:2020-11-03 15:54:08
【问题描述】:

我有一个共同的班级

public CommonClass {
    private Enum<?> field1;
    private String field2;
    private String field3;
    private Map<? extends Enum<?>, Map<String, Object>> map;
    // constructor, getters setters
}

还有两个枚举

public enum A {
  FIELD,
  VALUE
}
public enum B {
   ENUM1,
   ENUM1
}

并在它的类中解析json

{
  "field1": "FIELD",
  "field2": "field2",
  "field3": "field2",
  "map": {
    "ENUM1": {
           // some inner data
      },
    "ENUM2":{
          // some inner data
    }
   }
}

当我尝试将此 JSON 解析为一个对象时,我遇到了一个异常

java.lang.IllegalArgumentException: No enum constants for class java.lang.Enum

当 Jackson 尝试反序列化 的“ENUM1”时会发生此异常?将 Enum> 扩展到 B
当我调试它时,Jackson 认为这个属性是简单类型
有什么建议为什么它不起作用?

【问题讨论】:

    标签: java json jackson jackson-databind


    【解决方案1】:

    我认为默认情况下即使是这个简化的也不能反序列化:

    public class CommonClass {
        private Enum<?> field1;     
    }
    

    我是因为没有 Enum 也没有 enum 有 public no args 构造函数。前面提到的序列化很容易。但是要反序列化,您需要知道 which 枚举和哪个值。所以如果你有:

    public class CommonClass {
        private A field1;       
    }
    

    这会起作用,因为 Jackson 看到枚举的类型是 A 并且 - 我猜 - 让它看起来像:

    A.valueOf("FIELD");
    

    正如您在此处看到的,A 是静态的。 Enums 是静态的,它们的值也是最终的。

    如果你想反序列化任意通用枚举值Enum&lt;?&gt;,你需要有自定义的反序列化器来确定枚举类型和值,并像上面一样获取枚举的实例。而且您可能还需要一个自定义序列化程序,该序列化程序还可以序列化自定义反序列化程序要读取的类型。

    【讨论】:

    • 杰克逊反序列化枚举> field1 没有任何问题。它不能反序列化地图 Map, Map> 地图
    • @TarasDanylchenko 那么你试过我的简化课了吗?它对我不起作用。
    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多