Jackson Mapper serialize empty object instead of null

后端 未结 3 1097
梦毁少年i
梦毁少年i 2021-01-14 11:54

Say I have classes Foo

public class Foo {
    private Bar bar;
}

and Bar

public class Bar {
    private String fizz;
    pr         


        
相关标签:
3条回答
  • 2021-01-14 12:09

    You could create a custom serializer for serializing Foo objects. Then in your custom FooSerializer implementation, you could check for a null bar value and serialize it as a default Bar instance. See https://spin.atomicobject.com/2016/07/01/custom-serializer-jackson/ or http://www.baeldung.com/jackson-custom-serialization for some examples of how to create custom serializers.

    0 讨论(0)
  • 2021-01-14 12:13

    No. I don't see any way doing this. If you don't initialize your Bar, it'll be null inside the JSON.

    Since you can't alter these classes, you can just check if the Bar inside the Foo is null and if it is, just initialize it and you'll get what you want.

    Bar bar = foo.getBar();
    if (bar == null) {
        foo.setBar(new Bar());
    }
    String json = objectMapper.writeValueAsString(foo);
    

    The json will be the following:

    {
        "bar" : {
            "fizz" : null, 
            "bang" : null 
        } 
    }
    

    Hope this helps.

    0 讨论(0)
  • 2021-01-14 12:25

    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": {}
    }
    
    0 讨论(0)
提交回复
热议问题