Liste nulle de Jackson pour la sérialisation de tableau vide
Je veux sérialiser la liste nulle en tableau vide.
Alors donné:
class MyBean { List values; }
Et étant donné une instance avec null pour les valeurs, elle doit être sérialisée pour:
{ "values": [] }
Je veux que ce soit un comportement global pour toutes les listes dans toutes les classes. Je ne souhaite pas ajouter d'annotations ou de traitement spécifique pour les classes.
J'ai lu toutes les questions connexes que j'ai trouvées et je n'ai rien pu trouver qui fonctionne. Il semble que tout sérialiseur personnalisé que j'essaie de m'inscrire à la classe List ne fonctionne pas.
Si cela fonctionne sur votre projet, dites-moi comment vous avez réussi à le faire.
Réponses
Dans de tels cas, vous devez personnaliser la JacksonAnnotationIntrospector
classe. La sérialisation null
-s, par défaut, Jackson
utilise la com.fasterxml.jackson.databind.ser.std.NullSerializer
classe. Vous pouvez étendre la classe introspector par défaut et la remplacer findNullSerializer
.
Voir l'exemple ci-dessous:
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;
}
}
Au-dessus du code imprime:
{"values":[]}