Как удалить нулевые значения, сгенерированные пользовательским сериализатором Джексона? - PullRequest
1 голос
/ 28 февраля 2020

Учитывая следующий класс:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Account {

    [... A lot of serialized properties]

    @JsonSerialize(nullsUsing = JacksonSpringSpelSerializer.class, using = JacksonSpringSpelSerializer.class)
    @JsonView(View.Contract.class)
    @Value("#{@contractService.getActiveContract(#this)}")
    public Contract activeContract;

}

По существу, свойство activeContract равно нулю, и его значение оценивается только при условии правильного @JsonView, значение вычисляется выражением Spring Spel, все делается в пользовательском сериализаторе JacksonSpringSpelSerializer.

Все работает как положено, НО вычисленное значение иногда может быть нулевым, что является нормальным, и я получаю json, например:

{
    [... All properties],
    "activeContract": null
}

Проблема в том, что я не хочу, чтобы нулевые свойства были в возвращенных json, @JsonInclude(JsonInclude.Include.NON_EMPTY) игнорируется, когда для свойства установлен настраиваемый сериализатор.

Немного покопавшись, я обнаружил, что пользовательский сериализатор вызывается BeanPropertyWriter.serializeAsField(), который содержит:

    if (value == null) {
        if (_nullSerializer != null) {
            gen.writeFieldName(_name);
            _nullSerializer.serialize(null, gen, prov);
        }
        return;
    }

Таким образом, имя поля записывается gen.writeFieldName(_name); до того, как пользовательский сериализатор на самом деле вызвал, и я не нашел надлежащего способа предотвратить это поведение или удалить нулевые свойства, сгенерированные пользовательским Serializer.

Есть ли правильный способ для достижения такого результата? Любой совет будет очень кстати: D

Спасибо <3 </p>

1 Ответ

0 голосов
/ 28 февраля 2020

вы можете попробовать использовать JsonInclude.Include.NON_NULL, как следующий код

@JsonInclude(JsonInclude.Include.NON_NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...