I’m writing a application using Spring boot and jackson for JSON parsing. I need to handle another service which produces JSON like this:
{
"task-id": 5081,
"task-created-on": {
"java.util.Date": 1631022026000
}
}
Notably, certain fields like the date field here are serialized into a map with a single key-value pair, where the key is a java classname and the value is the actual value of the field.
I’ve been going through the jackson documentation and haven’t found anything about this format. Is there a way to configure jackson to produce and parse fields in this format?
At a minimum, I need to handle dates formatted this way. But I believe the service also uses this format for other objects, where the map key will be the name of some arbitrary java class and the value will be a map of its own. So I’d be interested in a solution that handles more than just dates if possible.
Advertisement
Answer
It is possible to solve the issue with the use of a custom JsonSerializer
and applying the JsonSerialize
over the fields in the pojo you are interested like below :
public class Task {
@JsonProperty("task-id")
private int taskId;
@JsonProperty("task-created-on")
@JsonSerialize(using = ObjectSerializer.class)
Date taskCreatedOn;
}
The custom serializer will use the JsonGenerator.html#writeObjectField
to serialize a generic object (Date
or other java class) as propertyname : {“classname” : value} :
public class ObjectSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object t, JsonGenerator jg, SerializerProvider sp) throws IOException {
jg.writeStartObject();
jg.writeObjectField(t.getClass().getName(), t);
jg.writeEndObject();
}
}