我想按类型序列化遇到的空值,例如将空字符串序列化为""
,布尔值为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;