Jackson JsonInclude.Include.NON_NULL不适用于自定义序列化程序

时间:2019-02-14 21:43:59

标签: java json jackson

我有一个自定义序列化程序,扩展了JsonSerializer<T> 并且在ObjectMapper中包括了setSerializationInclusion(JsonInclude.Include.NON_NULL)

我仍然看到null字段作为响应。

当前,我通过为每个属性检查null来忽略它们。我几乎有15个对象,很难为每个属性添加null检查。我正在使用的对象由我的应用程序共享,这就是为什么我使用自定义序列化程序来命名属性的原因

@Override
public void serialize(Person personBean, JsonGenerator jgen, SerializerProvider provider) throws IOException {
   if(personBean.getFirstName() != null){
      jgen.writeStringField("firstname", personBean.getFirstName() );
   }

   //etc...
}

如何避免null检查每个属性并实现一些通用代码来避免我的序列化响应中的null值。

1 个答案:

答案 0 :(得分:0)

不幸的是,当我们编写自定义序列化程序时,我们需要自己注意null值。为了使它至少好一点,我们可以添加新的writeStringField方法并使用它。例如:

class PersonJsonSerializer extends JsonSerializer<Person> {

    @Override
    public void serialize(Person value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        writeStringField(gen, "firstname", value.getFirstName());
        gen.writeEndObject();
    }

    private void writeStringField(JsonGenerator gen, String fieldName, String value) throws IOException {
        if (value != null) {
            gen.writeStringField(fieldName, value);
        }
    }
}

如果仅需要更改属性名称,则可以使用PropertyNamingStrategy选项。有几种可能性,例如:

  1. LOWER_CASE-命名约定,其中逻辑名称的所有单词均小写,并且单词之间不使用分隔符。
  2. KEBAB_CASE-在Lisp之类的语言中使用的命名约定,其中的单词为小写字母,并用连字符分隔。
  3. 有关更多检查文档

示例ObjectMapper的自定义如下所示:

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE);

如果没有预定义的策略可以满足您的需求,则可以使用JsonView注释。