给定以下类别:
@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)