Пустой список Джексона для сериализации пустого массива
Я хочу сериализовать нулевой список в пустой массив.
Так дано:
class MyBean { List values; }
И учитывая экземпляр с нулевым значением для значений, он должен быть сериализован в:
{ "values": [] }
Я хочу, чтобы это было глобальным поведением для всех списков во всех классах. Я не хочу добавлять аннотации или особую обработку классов.
Я прочитал все связанные вопросы, которые я нашел, и не смог придумать ничего, что работает. Кажется, любой пользовательский сериализатор, который я пытаюсь зарегистрировать для класса List, не срабатывает.
Если это работает над вашим проектом, дайте мне знать, как вам это удалось.
Ответы
В таких случаях вам нужно настроить JacksonAnnotationIntrospector
класс. Te serialize null
-s по умолчанию Jackson
использует com.fasterxml.jackson.databind.ser.std.NullSerializer
class. Вы можете расширить и переопределить класс интроспектора по умолчанию findNullSerializer
.
См. Пример ниже:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new EmptyArrayJacksonAnnotationIntrospector());
mapper.writeValue(System.out, new ListWrapper());
}
}
class EmptyArrayJacksonAnnotationIntrospector extends JacksonAnnotationIntrospector {
@Override
public Object findNullSerializer(Annotated a) {
if (List.class.isAssignableFrom(a.getRawType())) {
return ArrayNullSerializer.INSTANCE;
}
return super.findNullSerializer(a);
}
}
final class ArrayNullSerializer extends StdSerializer<Object> {
public static final ArrayNullSerializer INSTANCE = new ArrayNullSerializer();
protected ArrayNullSerializer() {
super(Object.class);
}
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartArray();
gen.writeEndArray();
}
}
class ListWrapper {
private List values;
public List getValues() {
return values;
}
public void setValues(List values) {
this.values = values;
}
}
Над кодом печатается:
{"values":[]}