Jackson null list per svuotare la serializzazione dell'array
Voglio serializzare l'elenco null in un array vuoto.
Così dato:
class MyBean { List values; }
E data un'istanza con null per i valori, dovrebbe essere serializzata in:
{ "values": [] }
Voglio che questo sia un comportamento globale per tutti gli elenchi in tutte le classi. Non voglio aggiungere annotazioni o manipolazioni specifiche per le classi.
Ho letto tutte le domande correlate che ho trovato e non sono riuscito a trovare nulla che funzioni. Sembra che qualsiasi serializzatore personalizzato che provo a registrare per la classe List non si sta attivando.
Se hai questo lavoro sul tuo progetto, fammi sapere come sei riuscito a farlo.
Risposte
In casi come questo è necessario personalizzare la JacksonAnnotationIntrospector
classe. Te serialize null
-s, per impostazione predefinita, Jackson
usa com.fasterxml.jackson.databind.ser.std.NullSerializer
class. È possibile estendere la classe Introspector predefinita e sovrascrivere findNullSerializer
.
Vedi esempio sotto:
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;
}
}
Stampe sopra il codice:
{"values":[]}