class FooBar
{
public FooBar(int foo, int bar)
{
this.foo = foo;
this.bar = bar;
}
public int getFoo()
{
}
public void setBar(int b)
{
this.bar = bar;
}
protected int getBar()
{
return bar;
}
private int foo;
private int bar;
}
Jackson有两种过滤不需要的属性的机制。最常用的是通过注释(@JsonIgnore、@JsonIgnoreProperties)进行筛选。在解释用法方面有很多示例(例如https://springframework.guru/jackson-annotations-json/)。
但是,如果您真的希望使用基于自定义条件的属性自定义筛选,那么您可以使用筛选(参见本文的参考https://www.logicbig.com/tutorials/misc/jackson/json-filter-annotation.html)。通过这种方式,您可以构建自己的序列化规则。
下面的示例代码说明了这种技术:
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.*;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Objects;
import java.util.stream.Stream;
public class M4 {
private static final String MY_FILTER_NAME = "myFilter";
@JsonFilter(MY_FILTER_NAME)
public static class MyPojo {
private int a;
private int b;
private int c;
public MyPojo(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void setB(int b) {
this.b = b;
}
public int getC() {
return c;
}
private void setC(int c) {
this.c = c;
}
}
private static class MySimpleBeanPropertyFilter extends SimpleBeanPropertyFilter {
@Override protected boolean include(BeanPropertyWriter writer) {
return super.include(writer);
}
@Override
protected boolean include(PropertyWriter writer) {
String setter = "set" + StringUtils.capitalize(writer.getName());
String getter = "get" + StringUtils.capitalize(writer.getName());
Class<?> declaringClass = writer.getMember().getDeclaringClass();
Method[] methods = declaringClass.getMethods();
return hasPublicMethod(setter, methods) && hasPublicMethod(getter, methods);
}
private boolean hasPublicMethod(String methodName, Method[] methods) {
return Stream.of(methods)
.filter(m -> Objects.equals(m.getName(), methodName))
.anyMatch(m -> Modifier.isPublic(m.getModifiers()));
}
}
private static class MyFilterProvider extends FilterProvider {
@Override public BeanPropertyFilter findFilter(Object filterId) {
return null;
}
@Override public PropertyFilter findPropertyFilter(Object filterId, Object valueToFilter) {
if (Objects.equals(filterId, MY_FILTER_NAME)) {
return new MySimpleBeanPropertyFilter();
}
return super.findPropertyFilter(filterId, valueToFilter);
}
}
public static void main(String args[]) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.writer().with(new MyFilterProvider()).writeValue(System.out, new MyPojo(0, 1, 3));
}
}
我不明白为什么我必须对类中的私有属性使用getter或setter。
问题内容: 在这个例子中 如果JSON对象缺少属性“ age”, 有人说它不能反序列化。在反序列化期间是否有 注释 可忽略丢失的字段? 谢谢 问题答案: 我想你想要的是 这就是Jackson 1.x的方式。我认为2.x中有一种新方法。就像是 这些将告诉Jackson仅序列化不为null的值,并且在反序列化缺少的值时不会抱怨。我认为它将只是将其设置为Java默认值。
问题内容: 我目前正在使用杰克逊2.1.4,并且在将对象转换为JSON字符串时忽略字段时遇到了一些麻烦。 这是我的类,它充当要转换的对象: 这是我如何转换它: 这是输出: 如何避免这些空值?我只想获取“订阅”目的所需的信息! 这正是我要查找的输出: 我还尝试了@JsonInclude(Include.NON_NULL)并将所有变量都设置为null,但是它也不起作用!感谢您的帮助! 问题答案: 您将
下面是我的类,它充当要转换的对象: 下面是我的转换方法: 输出如下: 下面正是我要查找的输出: 我还尝试了@jsonInclude(include.non_null),并将我的所有变量置为null,但也没有起作用!谢谢你们的帮助!
有两种类型的对象属性。 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor properties)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 Getter 和 setter 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get