Jackson的动态多态类型处理

adr*_*ano 13 java json jackson

我有一个类似于这个的类层次结构:

public static class BaseConfiguration {
}

public abstract class Base {
  private BaseConfiguration configuration;
  public String id;

  public BaseConfiguration getConfiguration() { ... }
  public void setConfiguration(BaseConfiguration configuration) { ... }
}

public class A extends Base {
   public static class CustomConfigurationA extends BaseConfiguration {
       String filename;
       String encoding;
   }

   CustomConfigurationA getConfiguration() { ... }
}

class B extends Base {
   public static class CustomConfigurationB extends BaseConfiguration {
       /* ... */
   }

   CustomConfigurationB getConfiguration() { ... }
}
Run Code Online (Sandbox Code Playgroud)

和json这样输入(我不能改变自己)

{
    "id":"File1",
    "configuration":{
         "filename":"...",
         "encoding":"UTF-8"
     }
}
Run Code Online (Sandbox Code Playgroud)

我正在用杰克逊解析Java中的JSON

ObjectMapper mapper = new ObjectMapper();
value = mapper.readValue(in, nodeType);
Run Code Online (Sandbox Code Playgroud)

我想使用JAVA/Jackson从JSON反序列化A,B和其他类.JSON中没有嵌入类型信息(也不可能).我不能在类上使用注释(我不拥有它们)和我(相信)我不能使用mixins,因为有可能任意数量的类,如A和B(并且mixin不是动态的).好的是反序列化代码知道哪个是用于反序列化的正确自定义类(基本上有从类到配置类的已知映射),但我不知道如何使杰克逊在反序列化JSON时识别这些信息.

简而言之:我希望能够通过设置ObjectMapper上的必要内容,根据周围的类类型解析配置对象的反序列化类型.怎么能实现这一目标?

Pro*_*uce 5

显然答案是实现类似于http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html上发布的第六个解决方案,它使用唯一的JSON元素名称来识别目标要反序列化的类型.