Jackson自定义属性 – 多态属性的类型映射名称

我试图反序列化一个相当复杂的POJO JSON,我需要定义一个特定的属性名称来解析,但是找不到这个相当简单的function。

假设一个类如下:

class Example { int id; Map extras; } 

和Jackson正确地将POJO序列化为JSON,其中地图被序列化为键值映射,就像预期的那样:

 {... id:5, extras:{object1:{...}, object2:{...}} ...} 

现在我想告诉jackson根据实际类型明确地反序列化附加对象。 所以我需要告诉Jackson以某种方式将“object1”映射到Type A,将“object2”映射到B型。

这可能吗? 谢谢。

有一个很好的指南如何处理它: http : //www.cowtowncoder.com/blog/archives/2010/03/entry_372.html

另一个教程:
http://programmerbruce.blogspot.de/2011/05/deserialize-json-with-jackson-into.html

可以修改第二个教程中的第6个示例,并且反序列化器将具有类似于以下内容的循环:

 Map types = ...// map of supported types JsonToken token = jsonParser.nextToken(); if(token == JsonToken.FIELD_NAME){ // "object1" etc. String name = jsonParser.getCurrentName(); Class type = types.get(name); Object object = jsonParser.readValueAs(type); } 

最简单的方法是启用所谓的“默认类型” – 它大致相当于添加@JsonTypeInfo注释(它支持多态类型处理) – 这会在值中添加类型信息。 所以:

 ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(); 

如果Extras映射仅包含那两个对象(object1和object2),则可以执行以下操作

 class TypeA { // TypeA body } class TypeB { // TypeB body } class Extras { private TypeA object1; private TypeB object2; // Getters and setters } class Example { int id; Extras extras; } 

这可以使用自定义解串器; 例如,请参阅此链接 。 在坚果壳中,你需要告诉jackson应该将一个字段解组为什么类型; 但是,如果序列化数据(JSON)动态变化,这可能会出错。

然后,您可以轻松地注释您的字段的setter,如下所示:

 ObjectA value; @JsonDeserialize(using=ObjectADeserializer.class) public void setValue(ObjectA objectAValue) { this.value = objectAValue; }