import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; public class NullHandlerDeserializer extends UntypedObjectDeserializer { private static final long serialVersionUID = 1L; @Override public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { switch (jp.getCurrentToken()) { case VALUE_NULL: return ""; default: return super.deserialize(jp, ctxt); } } }
The class extends from an existing deserializer implementation to avoid having to code the handling of all JSON tokens. I needed to worry only about VALUE_NULL token.
And to configure the custom deserializer in the ObjectMapper:
ObjectMapper om = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(Object.class, new NullHandlerDeserializer()); om.registerModule(module);