我已经测试了几种从输出文件(Json)中删除java对象中Null值的方法。 但是,似乎有些遗漏了。 我正在使用2.9.6
我尝试了以下操作:
objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.setSerializationInclusion(Include.NON_EMPTY);
@JsonInclude(Include.NON_NULL);
这是我的代码:
public static String convertToJson(Hospital patient) {
try {
if (patient != null) {
String json = objectMapper.writeValueAsString(patient);
return json;
}
} catch (IOException e) {
throw new RuntimeException("Error converting person to Json " + e);
}
return null;
}
这些已从输出文件中删除了大约2150个null。 但是,结果仍然具有以下形式:
"patient" : {
"corporateEntityCode" : "OH",
"groupNumber" : "123ABCD",
"patientIdentifier" : 12345678,
"patientPreexistingDiagnosticCode" : [ null, null, null, null, null, null ],
"patientPreexistingEffectiveDate" : [ null, null, null, null, null, null ],
"patientSubscriptNumber" : "01",
"subscriberNumber" : "0000000123456789"
}
这是现有问题吗? 还是我执行不正确?
答案 0 :(得分:1)
这似乎不是库中的现有问题,但是令人惊讶的是,使用Include.NON_NULL
会对Map
产生影响,而忽略value
是{{ 1}},但对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
这是序列化的json:
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));
}