Tim Tim - 5 months ago 43
Java Question

Jackson dynamic property names

I would like serialize an object such that one of the fields will be named different based on the type of the field. For example:

public class Response {
private Status status;
private String error;
private Object data;
[ getters, setters ]

Here, I would like the field
to be serialized to something like
instead of always having a field called
which contains a different type depending on the situation.

How might I achieve such a trick using Jackson?


Using a custom JsonSerializer.

public class Response {
  private String status;
  private String error;

  @JsonSerialize(using = CustomSerializer.class)
  private Object data;

  // ...

public class CustomSerializer extends JsonSerializer<Object> {
  public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
    jgen.writeObjectField(value.getClass().getName(), value);

And then, suppose you want to serialize the following two objects:

public static void main(String... args) throws Exception {
  ObjectMapper mapper = new ObjectMapper();
  Response r1 = new Response("Error", "Some error", 20);
  Response r2 = new Response("Error", "Some error", "some string");

The first one will print:

{"status":"Error","error":"Some error","p":{"java.lang.Integer":20}}

And the second one:

{"status":"Error","error":"Some error","p":{"java.lang.String":"some string"}}

I have used the name p for the wrapper object since it will merely serve as a placeholder. If you want to remove it, you'd have to write a custom serializer for the entire class, i.e., a JsonSerializer<Response>.