我有一个这样的对象:

public class MyObject {
    private String name;
    private int number;
    // ...
}

而且我只想在值不为负时包含number(number >= 0)。

在研究过程中,我发现了Jackson serialization: ignore empty values (or null)Jackson serialization: Ignore uninitialised int。二者都使用@JsonIncludeInclude.NON_NULLInclude.NON_EMPTYInclude.NON_DEFAULT批注,但是它们都不适合我的问题。

我可以在我的条件@JsonInclude中以某种方式使用number >= 0来仅在不为负的情况下包括该值吗?还是有另一种解决方案可以实现?

最佳答案

如果您使用Jackson 2.9+版本,则可以尝试使用Include.Custom@JsonInclude值。
the JsonInclude.CUSTOM specification:

指示单独的filter对象的值(由
值本身的JsonInclude.valueFilter()和/或
JsonInclude.contentFilter()用于结构化类型的内容)
用于确定纳入标准。过滤对象的equals()
用值调用方法进行序列化;如果返回true,则值为
排除了(即过滤掉);如果false值为,则包括

与定义自定义序列化程序相比,这是一种更具体和声明性的方法。

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = PositiveIntegerFilter.class)
private int number;

// ...
public class PositiveIntegerFilter {
    @Override
    public boolean equals(Object other) {
       // Trick required to be compliant with the Jackson Custom attribute processing
       if (other == null) {
          return true;
       }
       int value = (Integer)other;
       return value < 0;
    }
}

它与objects和基元一起使用,并将基元包装到filter.equals()方法中的包装器中。

09-26 17:26