Это не похоже на существующую проблему в библиотеке, но удивительно, что при использовании Include.NON_NULL
это влияет на Map
, игнорируя пары, где value
равно null
, но не имеетлюбое воздействие на Array
или Collection
.В любом случае, вы можете легко достичь желаемого с помощью специального сериализатора.Я создал другую модель, чтобы показать вам, как это сделать.Пример охватывает пользовательскую сериализацию Arrays
и любой класс, который расширяет Collection
.
Класс модели Hospital
:
public class Hospital {
private List<String> patients;
private String[] doctors;
public List<String> getPatients() {
return patients;
}
public void setPatients(List<String> patients) {
this.patients = patients;
}
public String[] getDoctors() {
return doctors;
}
public void setDoctors(String[] doctors) {
this.doctors = doctors;
}
}
Пользовательский сериализатор, игнорирующий значения null
в классахCollection
:
class CollectionIgnoreNullSerializer extends StdSerializer<Collection> {
public CollectionIgnoreNullSerializer() {
this(null);
}
public CollectionIgnoreNullSerializer(Class<Collection> t) {
super(t);
}
@Override
public void serialize(Collection list, JsonGenerator jsonGenerator, SerializerProvider unused) throws IOException {
jsonGenerator.writeStartArray();
list.forEach(e -> {
try {
if (e != null) {
jsonGenerator.writeObject(e);
}
} catch (IOException e1) {
e1.printStackTrace();
}
});
jsonGenerator.writeEndArray();
}
}
Пользовательский сериализатор для игнорирования null
значений в Array
:
class ArrayIgnoreNullSerializer extends StdSerializer<Object[]> {
public ArrayIgnoreNullSerializer() {
this(null);
}
public ArrayIgnoreNullSerializer(Class<Object[]> t) {
super(t);
}
@Override
public void serialize(Object[] array, JsonGenerator jsonGenerator, SerializerProvider unused) throws IOException {
jsonGenerator.writeStartArray();
for (int i = 0; i < array.length; i++) {
try {
if (array[i] != null) {
jsonGenerator.writeObject(array[i]);
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
jsonGenerator.writeEndArray();
}
}
main
только для его проверки:
public static void main(String[] args) throws IOException {
Hospital hospital = new Hospital();
List<String> patients = Arrays.asList(null, "Bob", "Tom", null, null);
String[] doctors = new String[]{null, "Dr. Grimmer", "Dr. Who", null};
hospital.setPatients(patients);
hospital.setDoctors(doctors);
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Collection.class, new CollectionIgnoreNullSerializer());
// You could apply the custom serialization just to Lists:
// module.addSerializer(List.class, new CollectionIgnoreNullSerializer());
module.addSerializer(String[].class, new ArrayIgnoreNullSerializer());
// You could cover other type of Arrays like this:
// module.addSerializer(Integer[].class, new ArrayIgnoreNullSerializer());
mapper.registerModule(module);
System.out.println(mapper.writeValueAsString(hospital));
}
И это сериализованный JSON:
{"patients":["Bob","Tom"],"doctors":["Dr. Grimmer","Dr. Who"]}