如果我有一个值设置为“custom_string”的属性,有没有办法在使用POJO和Jackson时忽略它?
我知道你可以使用@JsonInclude(Include.NON_NULL)
忽略null,但有没有办法忽略自定义值?我似乎无法在任何地方找到任何关于此的说明。
我知道我的Getter中可能只有return value.equals("custom_string") ? null : value
......但我更喜欢更优雅的方式。
答案 0 :(得分:2)
另一种可能的解决方案是使用自定义过滤器,您可以在其中组合多个需求。假设我们要过滤空值和“ custom_string”,那么我们应该指定我们将使用JsonInclude.Include.CUSTOM值并提供过滤器实现。示例:
@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = StringFilter.class)
private String name;
// Custom filter that will omit null and "custom_string" values.
public class StringFilter {
@Override
public boolean equals(Object other) {
if (other == null) {
// Filter null's.
return true;
}
// Filter "custom_string".
return "custom_string".equals(other);
}
}
答案 1 :(得分:1)
什么是最聪明的因您的要求而异。
Jackson提供了使用默认值忽略属性的方法(通过使用@JsonSerialize(include = Inclusion.NON_DEFAULT)
注释类,因此如果您可以设置字段的默认值“custom_string”,则解决方案可能可用。
我知道的其他解决方案是将对象转换为Map
,然后简单地序列化,通过反射添加注释,或者创建自己的自定义序列化器。自定义序列化程序可能如下所示:
public class YourItem {
public String key;
public String item;
}
public class YourItemSerializer extends StdSerializer<YourItem> {
@Override
public void serialize(YourItem value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
jgen.writeStartObject();
jgen.writeStringField("key", value.key);
if (!"custom_string".equals(value.item))
jgen.writeStringField("item", value.item);
jgen.writeEndObject();
}
}
答案 2 :(得分:1)
使用JsonInclude.Include.Custom
进行了尝试,它就像一种魅力。
注释:
@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = MaskingFilter.class)
private String firstname;
过滤器类:
public class MaskingFilter {
public MaskingFilter() {
}
@Override
public boolean equals(Object value) {
if(value == null)
return true;
return "****MASKED_VALUE****".equals(value);
}
}
如果在这种情况下的名字等于“ **** MASKED_VALUE ****”,则它不属于结果。