jackson推迟反序列化领域

我有一个这样的课:

public class DeserializedHeader int typeToClassId; Object obj 

我知道obj基于typeToClassId是什么类型的对象,遗憾的是,它只在运行时才知道。

我想基于typeToClassId解析obj – 这里最好的方法是什么? 注释似乎已经出局了,基于ObjectMapper的东西似乎是正确的,但我很难弄清楚最好的方法可能是什么。

Class clazz = lookUpClassBasedOnId(typeToClassId)objectMapper.readValue(obj,clazz)

显然,这不起作用,因为obj已经被反序列化…但是我可以用两个步骤以某种方式执行此操作,也许使用convertValue?

这是一个非常复杂和痛苦的问题。 我不知道任何复杂而优雅的解决方案,但我可以与您分享我开发的想法。 我创建了示例程序,帮助我向您展示如何解决您的问题。 一开始我创建了两个简单的POJO类:

 class Product { private String name; // getters/setters/toString } 

 class Entity { private long id; // getters/setters/toString } 

这些类的示例输入JSON可能如下所示。 对于Product类:

 { "typeToClassId" : 33, "obj" : { "name" : "Computer" } } 

Entity类:

 { "typeToClassId" : 45, "obj" : { "id" : 10 } } 

我们想要使用的主要function是“部分序列化/反序列化”。 为此,我们将在ObjectMapper上启用FAIL_ON_UNKNOWN_PROPERTIESfunction。 现在我们必须创建两个定义typeToClassIdobj属性的类。

 class HeaderType { private int typeToClassId; public int getTypeToClassId() { return typeToClassId; } public void setTypeToClassId(int typeToClassId) { this.typeToClassId = typeToClassId; } @Override public String toString() { return "HeaderType [typeToClassId=" + typeToClassId + "]"; } } class HeaderObject { private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } @Override public String toString() { return "HeaderObject [obj=" + obj + "]"; } } 

最后,可以解析JSON的源代码:

 // Simple binding Map> classResolverMap = new HashMap>(); classResolverMap.put(33, Product.class); classResolverMap.put(45, Entity.class); ObjectMapper mapper = new ObjectMapper(); mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); String json = "{...}"; // Parse type HeaderType headerType = mapper.readValue(json, HeaderType.class); // Retrieve class by integer value Class clazz = classResolverMap.get(headerType.getTypeToClassId()); // Create dynamic type JavaType type = mapper.getTypeFactory().constructParametricType(HeaderObject.class, clazz); // Parse object HeaderObject headerObject = (HeaderObject) mapper.readValue(json, type); // Get the object Object result = headerObject.getObj(); System.out.println(result); 

有用的url:

  1. 如何将Java地图转换为JSON(jackson) 。
  2. java jackson parse包含generics类型对象的对象 。