Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jackson Mapper serialize empty object instead of null

Say I have classes Foo

public class Foo {
    private Bar bar;
}

and Bar

public class Bar {
    private String fizz;
    private String bang;
}

EDIT: For clarification I do not own Foo and Bar and cannot alter these classes.

If I want to serialize an empty object of type Foo, it's member, which is of type Bar, will be returned as null.

String json = objectMapper.writeValueAsString(new Foo()); // "{"bar" : null}"

Is there any way I can get the object mapper to serialize an empty Bar object without having to instantiate a new instance of Bar and then adding it to a new instance of Foo?

String json = objectMapper.writeValueAsString(new Foo()) // "{bar": {"fizz" : null, "bang" : null } }"
like image 644
user3335313 Avatar asked Sep 05 '25 03:09

user3335313


1 Answers

I was also required to produce such a structure for legacy client compatibility, here is my solution (depends on Spring Boot since uses @JsonComponent annotation)

Create "special object" that will be treated as empty

public class EmptyObject {
}

Create property in your model

@JsonProperty("data")
private EmptyObject data = new EmptyObject();

public EmptyObject getData() {
    return data;
}

Create serializer that will process empty object above

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.sevensenders.datahub.api.service.response.model.EmptyObject;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;

@JsonComponent
public class EmptyObjectSerializer extends StdSerializer<EmptyObject> {

    public EmptyObjectSerializer() {
        this(null);
    }

    public EmptyObjectSerializer(Class<EmptyObject> t) {
        super(t);
    }

    @Override
    public void serialize(EmptyObject value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        // to maintain AF compatible format it is required to write {} instead of null
        gen.writeStartObject();
        gen.writeEndObject();
    }
}

Output:

{
  ...
  "data": {}
}
like image 169
Cmyker Avatar answered Sep 07 '25 19:09

Cmyker