杰克逊基于类型

时间:2015-11-09 18:29:28

标签: java json serialization jackson deserialization

我认为应该是一个简单的用例。

我想序列化一个带有类型元数据的POJO(最好是我提出的简单名称,而不是完全限定的类/包名),然后杰克逊将JSON反序列化为它来自的具体类。这个元数据。在被序列化和反序列化的类之间没有继承层次结构。

我的方案是我有一个接受多种文件类型的服务。对于上载的每个文件,客户端可以检索JSON数据,其结构和类型取决于它来自的文件。因此,当我从服务中检索JSON时,不知道要反序列化的具体类是什么。我希望杰克逊能够根据它提供的元数据来解决这个问题。

例如,我希望能够这样做:

String json = ... // get JSON from the service
Object obj = mapper.readValue(json, Object.class) // concrete class is not known
System.out.println(obj.getClass()) // I want this to be MyConcreteClass.class
  • 返回的JSON类型之间没有继承层次结构。
  • 我不想透露包裹名称或其他内部服务 细节/结构
  • 我控制了杰克逊的序列化过程

相关问题:Can jackson determine root object type to deserialize to when json includes type property?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

这可以使用杰克逊的JavaType

来实现
String className = "class.name.from.json.service";
JavaType dtoType = TypeFactory.defaultInstance().constructFromCanonical(className);
Object dto = new ObjectMapper().readValue(InputStream, dtoType);
assert dto.getClass().equals(dtoType.getRawClass());