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_PROPERTIES
function。 现在我们必须创建两个定义typeToClassId
和obj
属性的类。
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:
- 如何将Java地图转换为JSON(jackson) 。
- java jackson parse包含generics类型对象的对象 。