setSerializationInclusion(Include.NON_EMPTY)不排除数组中的Null

时间:2018-09-21 16:44:39

标签: java json jackson

我已经测试了几种从输出文件(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"
}

这是现有问题吗? 还是我执行不正确?

1 个答案:

答案 0 :(得分:1)

这似乎不是库中的现有问题,但是令人惊讶的是,使用Include.NON_NULL会对Map产生影响,而忽略value是{{ 1}},但对nullArray没有任何影响。无论如何,您可以使用自定义序列化器轻松实现所需的功能。我创建了一个不同的模型只是为了向您展示如何做到这一点。该示例涵盖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)); }