Search code examples
jsonserializationjackson-databind

Is there a way in Jackson 2.8 to serialize nulls to empty string


I want to serialize nulls encountered by type, e.g. null strings as "", Boolean to false, and objects to "{}". I tried following Jackson documentation here: https://github.com/FasterXML/jackson-docs/wiki/JacksonHowToCustomSerializers but it seems that in 2.8 there is no StdSerializerProvider.

Since that isn't working I tried to define custom serializers with @JsonSerialize(using = StringSerializer.class).

@Override
public void serialize(
        final String value,
        final JsonGenerator jsonGenerator,
        final SerializerProvider serializerProvider
) throws IOException {
    if(value == null) {
        jsonGenerator.writeString(StringUtils.EMPTY);
    } else {
        jsonGenerator.writeString(value);
    }
}

However, I notice that when the object is null it never tries to process null values. Is there a way in Jackson 2.8 to specify overrides for serializing null values?


Solution

  • After looking through documentation I found that Jackson uses nullsUsing parameter in JsonSerialize. So for example:

    @JsonSerialize(nullsUsing = NullMapSerializer.class)
    private Map<String, String> map;
    

    I defined different serializers like so:

    public class NullMapSerializer extends JsonSerializer<Map> {
        @Override
        public void serialize(
                final Map value,
                final JsonGenerator jsonGenerator,
                final SerializerProvider serializerProvider
        ) throws IOException {
            jsonGenerator.writeStartObject();
            jsonGenerator.writeEndObject();
        }
    }
    
    public class NullListSerializer extends JsonSerializer<List> {
        @Override
        public void serialize(
                final List list,
                final JsonGenerator jsonGenerator,
                final SerializerProvider serializerProvider
        ) throws IOException {
            jsonGenerator.writeStartArray();
            jsonGenerator.writeEndArray();
        }
    }
    
    public class NullStringSerializer extends JsonSerializer<String> {
    
        @Override
        public void serialize(
                final String value,
                final JsonGenerator jsonGenerator,
                final SerializerProvider serializerProvider
        ) throws IOException {
            jsonGenerator.writeString(StringUtils.EMPTY);
        }
    }
    

    This serializes fields into {}, [], or "" whenever values are null, and normally otherwise.