@JsonInclude (Include.NON_EMPTY) не работает при использовании CUSTOM SERIALIZER - PullRequest
0 голосов
/ 28 февраля 2019

Кажется, что когда я использую пользовательские сериализаторы, @JsonInclude(Include.NON_NULL) полностью игнорируется.

Мое требование - не сериализовать ключи, значения которых равны нулю.Я также хочу отформатировать строку, добавив разделители пробела для многозначного SortedSet (поэтому я создал собственный сериализатор)

Пример текущего вывода без каких-либо нулевых значений

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

Примертекущего вывода со значением NULL

{
  "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;
}

Custom Serializer

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 голосов
/ 01 марта 2019

Решено:

Мне пришлось переопределить метод isEmpty в моем пользовательском сериализаторе

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