使用自定义SERIALIZER时,@ JsonInclude(Include.NON_EMPTY)不起作用

时间:2019-02-28 20:43:00

标签: java json java-11 jsonserializer

当我使用自定义序列化程序时,@JsonInclude(Include.NON_NULL)似乎被完全忽略了。

我的要求是不要序列化值为空的键。我还想通过为多值SortedSet添加空格分隔符来格式化字符串(这就是我创建自定义序列化程序的原因)

没有任何空值的当前输出示例

{
  "age": "10",
  "fullName": "John Doe"
  "email":"doe@john.com john@doe.com test@gmail.com"
}

具有空值的当前输出示例

{
  "age": "10",
  "fullName": "John Doe"
  "email":null
}

电子邮件为空时的预期输出:

{
  "age": "10",
  "fullName": "John Doe"
}

DTO

@AllArgsConstructor
@Builder
@Data
@NoArgsConstructor
@ToString
@SuppressWarnings("PMD.TooManyFields")
public class User {
    @JsonProperty("age")
    private String age;

    @JsonProperty("firstName")
    private String name;

    @JsonProperty("email")
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @JsonSerialize(using = MultiValuedCollectionSerializer.class)
    private SortedSet<String> email;
}

自定义序列化器

public class MultiValuedCollectionSerializer extends JsonSerializer<Collection> {

    @Override
    public void serialize(final Collection inputCollection, 
                          final JsonGenerator jsonGenerator, 
                          final SerializerProvider serializers) throws IOException {

        jsonGenerator.writeObject(Optional.ofNullable(inputCollection)
                .filter(input -> !input.isEmpty())
                .map(collection -> String.join(" ", collection))
                .orElse(null));
    }

}

1 个答案:

答案 0 :(得分:2)

已解决:

我必须在自定义序列化程序中覆盖isEmpty方法

@Override
public boolean isEmpty(SerializerProvider provider, Collection value) {
    return (value == null || value.size() == 0);
}