Boş dizi serileştirmeye Jackson boş listesi

Aug 19 2020

Boş Listeyi boş diziye serileştirmek istiyorum.

Yani verilen:

class MyBean { List values; }

Ve değerler için boş olan bir örnek verildiğinde, şu şekilde serileştirilmelidir:

{ "values": [] }

Bunun tüm sınıflardaki tüm Listeler için genel bir davranış olmasını istiyorum. Sınıflar için herhangi bir ek açıklama veya özel işlem eklemek istemiyorum.

Bulduğum ilgili tüm soruları okudum ve işe yarayan hiçbir şey bulamadım. List sınıfına kaydolmaya çalıştığım herhangi bir özel serileştirici devreye girmiyor gibi görünüyor.

Bunu projeniz üzerinde çalıştırıyorsanız, bunu nasıl başardığınızı bana bildirin.

Yanıtlar

2 MichałZiober Aug 19 2020 at 09:48

Bu gibi durumlarda JacksonAnnotationIntrospectorsınıfı özelleştirmeniz gerekir . Te serialize null-s, varsayılan olarak sınıfı Jacksonkullanır com.fasterxml.jackson.databind.ser.std.NullSerializer. Varsayılan introspektör sınıfını genişletebilir ve geçersiz kılabilirsiniz findNullSerializer.

Aşağıdaki örneğe bakın:

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

Yukarıdaki kod baskıları:

{"values":[]}