当前位置: 首页 > 知识库问答 >
问题:

如果缺少getter或setter(或不可见),则忽略Jackson中的属性

咸正平
2023-03-14
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;
}

共有1个答案

南宫喜
2023-03-14

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