Niru
Niru

Reputation: 1547

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?

Upvotes: 0

Views: 4010

Answers (2)

Radu Linu
Radu Linu

Reputation: 1261

If you want to have a general method for any object, there can be used the following:

public class NullObjectSerializer extends JsonSerializer<Object> {

    @Override
    public void serialize(Object action, JsonGenerator generator, SerializerProvider provider) throws IOException {
        generator.writeString(StringUtils.EMPTY);
    }
}

And the field will be marked:

@JsonSerialize(nullsUsing = NullObjectSerializer.class)
private MyEnum enumField;

Upvotes: 1

Niru
Niru

Reputation: 1547

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.

Upvotes: 5

Related Questions