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



我想按类型序列化遇到的空值,例如将空字符串序列化为"",布尔值为false,对象为"{}"。 我在这里尝试遵循杰克逊文档: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);
}
}

但是,我注意到当对象为空时,它从不尝试处理空值。有没有办法在 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;

最新更新