给定以下类别:

@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为null,并且仅当提供正确的@JsonView时才评估其值,该值由Spring Spel表达式计算,所有操作均在自定义序列化器JacksonSpringSpelSerializer中完成。

一切都按预期工作,但计算值有时可以为null,这是正常现象,而我最终得到一个像这样的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);编写的,我没有找到防止此行为或删除由自定义序列化程序生成的null属性的正确方法。

有没有适当的方法来达到这样的结果?任何建议将非常欢迎:D

谢谢

最佳答案

您可以尝试使用JsonInclude.Include.NON_NULL,如以下代码所示

@JsonInclude(JsonInclude.Include.NON_NULL)

09-13 02:35