JSON Jackson - exception when serializing a polymorphic class with custom serializer
You'll need to additionally override serializeWithType
within you CustomPetSerializer
because IPet
is polymorphic. That's also the reason why serialize
is not called. Check this related SO question that explains in detail when serializeWithType
is called. For instance, your serializeWithType
implementation might look something like this:
@Override
public void serializeWithType(IPet value, JsonGenerator gen,
SerializerProvider provider, TypeSerializer typeSer)
throws IOException, JsonProcessingException {
typeSer.writeTypePrefixForObject(value, gen);
serialize(value, gen, provider); // call your customized serialize method
typeSer.writeTypeSuffixForObject(value, gen);
}
which will print {"pet":{"type":"dog":{"age":"7"}}}
for your Human
instance.
Since Jackson 2.9 writeTypePrefixForObject()
and writeTypeSuffixForObject()
have been deprecated (I'm unclear why). It seems under the new approach it would now be:
@Override
public void serializeWithType(IPet value, JsonGenerator gen,
SerializerProvider provider, TypeSerializer typeSer)
throws IOException, JsonProcessingException {
WritableTypeId typeId = typeSerializer.typeId(value, START_OBJECT);
typeSer.writeTypePrefix(gen, typeId);
serialize(value, gen, provider); // call your customized serialize method
typeSer.writeTypeSuffix(gen, typeId);
}
So an extra line now, so not sure why it's a step forward, perhaps it's more efficient reusing the typeId
object.
Source: Jackson's ObjectNode class currently in master. Not the best source but couldn't see any upgrade docs explaining what to do.