Java 如何删除jackson自定义序列化程序生成的空值?
鉴于以下类别:Java 如何删除jackson自定义序列化程序生成的空值?,java,json,serialization,jackson,jsonserializer,Java,Json,Serialization,Jackson,Jsonserializer,鉴于以下类别: @JsonInclude(JsonInclude.Include.NON_EMPTY) public class Account { [... A lot of serialized properties] @JsonSerialize(nullsUsing = JacksonSpringSpelSerializer.class, using = JacksonSpringSpelSerializer.class) @JsonView(View.Con
@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
中完成
一切正常,但计算值有时可能为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)
如果您已经以某种方式全局或在字段中指定了Include.NON_EMPTY
,则还必须重写com.fasterxml.jackson.databind.JsonSerializer\isEmpty(com.fasterxml.jackson.databind.SerializerProvider,T)
静态类序列化程序扩展JsonSerializer{
@凌驾
公共void序列化(Foo值、JsonGenerator gen、SerializerProvider序列化程序)引发IOException{
//连载
}
@凌驾
公共布尔值isEmpty(SerializerProvider提供程序,Foo值){
//这将被调用为Include.NON_EMPTY
boolean-isitenty=//以某种方式获取它
回归诱惑;
}
}
如果是customer Jackson序列化程序,您能否在自定义序列化程序的serialize()方法中添加跳过空字段的逻辑?我就是这么做的,但序列化程序是由一个首先写入属性名称的类调用的。如果我的序列化程序什么都不做,我会得到{“activeContract”}
。如果序列化程序执行gen.writeNull()代码>我得到{“activeContract”:null}
。当您想使用JsonInclude.Include.NON_EMPTY
和自定义序列化程序一起使用时,我找不到从序列化程序本身跳过字段的方法,您还需要实现isEmpty
方法。看一看类似的例子:我尝试过,但不幸的是它没有工作,对于同一个问题,字段的值为null,并且可能由序列化程序填充。JacksonBeanPropertyWriter
不会检查isEmpty方法是否注释的字段已为null:它适用于双精度情况,因为序列化属性不是null,但可能<0这是我尝试的,但是,如果一个字段有一个自定义序列化程序,而JsonInclude
只是ignored@JsonSerialize(使用=JacksonSpringSpelSerializer.class);删除'nullsUsing=JacksonSpringSpelSerializer.class',它可能会正常工作。我不能,因为该值为null,并且由序列化程序填充^^
static class Serializer extends JsonSerializer<Foo> {
@Override
public void serialize(Foo value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
// serialize
}
@Override
public boolean isEmpty(SerializerProvider provider, Foo value) {
// this will be called for Include.NON_EMPTY
boolean isitEmpty = // get it somehow
return isitEmpty;
}
}