忽略给定的自定义值Jackson JSON

时间:2015-07-06 16:15:55

标签: java json jackson

如果我有一个值设置为“custom_string”的属性,有没有办法在使用POJO和Jackson时忽略它?

我知道你可以使用@JsonInclude(Include.NON_NULL)忽略null,但有没有办法忽略自定义值?我似乎无法在任何地方找到任何关于此的说明。

我知道我的Getter中可能只有return value.equals("custom_string") ? null : value ......但我更喜欢更优雅的方式。

3 个答案:

答案 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 ****”,则它不属于结果。