Jackson-Nullliste zum Leeren der Array-Serialisierung

Aug 19 2020

Ich möchte die Nullliste in ein leeres Array serialisieren.

So gegeben:

class MyBean { List values; }

Und wenn eine Instanz mit null für Werte angegeben wird, sollte sie serialisiert werden in:

{ "values": [] }

Ich möchte, dass dies ein globales Verhalten für alle Listen in allen Klassen ist. Ich möchte keine Anmerkungen oder spezielle Behandlung für Klassen hinzufügen.

Ich habe alle verwandten Fragen gelesen, die ich gefunden habe, und konnte mir nichts einfallen lassen, was funktioniert. Es scheint, als würde ein benutzerdefinierter Serializer, den ich für die List-Klasse registrieren möchte, nicht aktiviert.

Wenn Sie dies an Ihrem Projekt arbeiten lassen, lassen Sie mich wissen, wie Sie das geschafft haben.

Antworten

2 MichałZiober Aug 19 2020 at 09:48

In solchen Fällen müssen Sie die JacksonAnnotationIntrospectorKlasse anpassen . Bei der Serialisierung von null-s wird standardmäßig Jacksondie com.fasterxml.jackson.databind.ser.std.NullSerializerKlasse verwendet. Sie können die Standard-Introspector-Klasse erweitern und überschreiben findNullSerializer.

Siehe Beispiel unten:

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;
    }
}

Der obige Code druckt:

{"values":[]}