Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jackson Custom Property-Name to Type Mapping for Polymorphic Properties

Tags:

java

jackson

I am trying to deserialize a rather complex POJOs JSON, where I would need to define a specific property-name to type resolution, but yet faild fininding this rather simple feature.

assume a class like:

class Example {
  int id;
  Map<String,Object> extras;
}

and Jackson is serializing the POJO correctly to JSON where the map is serialized to a key-value map just like expected:

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

now I would like to tell Jackson to explicitly deserialize the extras objects by their actual type. So I need to tell Jackson somehow to map "object1" to Type A and "object2" to type B.

Is this possible? Thanks.

like image 562
joecks Avatar asked Feb 19 '23 19:02

joecks


2 Answers

There is nice guide how to deal with it: http://www.cowtowncoder.com/blog/archives/2010/03/entry_372.html

And another tutorial:
http://programmerbruce.blogspot.de/2011/05/deserialize-json-with-jackson-into.html

The 6th example from the second tutorial could be modified and deserializer would have loop with something similar to:

Map<String, Class> 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);
}
like image 78
pawelzieba Avatar answered Feb 27 '23 11:02

pawelzieba


The easiest way is to enable so-called "default typing" -- it does roughly equivalent of adding @JsonTypeInfo annotation (which enables support polymorphic type handling) -- and this adds type information in values. So:

ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
like image 24
StaxMan Avatar answered Feb 27 '23 11:02

StaxMan