Jackson 2.8 中有没有办法将空值序列化为空字符串

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

我想序列化按类型遇到的空值,例如空字符串 "",布尔值 false,对象 "{}"。 我在这里尝试遵循 Jackson 文档:https://github.com/FasterXML/jackson-docs/wiki/JacksonHowToCustomSerializers 但似乎在 2.8 中没有 StdSerializerProvider。

由于这不起作用,我尝试使用 @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);
    }
}

但是,我注意到当对象为 null 时,它从不尝试处理 null 值。 Jackson 2.8 中有没有一种方法可以指定覆盖以序列化空值?

查看文档后,我发现 Jackson 在 JsonSerialize 中使用了 nullsUsing 参数。例如:

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

我这样定义了不同的序列化程序:

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);
    }
}

这会将字段序列化为 {}、[] 或 "",只要值为 null,否则通常为空。

如果你想对任何对象有一个通用的方法,可以使用以下方法:

public class NullObjectSerializer extends JsonSerializer<Object> {

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

字段将被标记为:

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