Jackson null list untuk mengosongkan serialisasi array
Saya ingin membuat serialisasi Daftar null ke array kosong.
Jadi diberikan:
class MyBean { List values; }
Dan diberi contoh dengan nilai null, itu harus diserialkan ke:
{ "values": [] }
Saya ingin ini menjadi perilaku global untuk semua Daftar di semua kelas. Saya tidak ingin menambahkan penjelasan atau penanganan khusus untuk kelas.
Saya telah membaca semua pertanyaan terkait yang saya temukan, dan tidak dapat menemukan apa pun yang berhasil. Tampaknya serializer khusus yang saya coba daftarkan untuk kelas List tidak berfungsi.
Jika Anda telah mengerjakan ini pada proyek Anda, beri tahu saya bagaimana Anda bisa melakukannya.
Jawaban
Dalam kasus seperti ini, Anda perlu menyesuaikan JacksonAnnotationIntrospector
kelas. Te serialize null
-s, secara default, Jackson
menggunakan com.fasterxml.jackson.databind.ser.std.NullSerializer
class. Anda dapat memperluas kelas introspektor default dan mengganti findNullSerializer
.
Lihat contoh di bawah ini:
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;
}
}
Di atas cetakan kode:
{"values":[]}