Java Jackson字段注释忽略除列出的属性以外的所有属性

Java Jackson字段注释忽略除列出的属性以外的所有属性,java,json,jackson,Java,Json,Jackson,是否有字段和/或getter的Jackson注释忽略字段值的所有属性(列出的属性除外) 当应用于字段时,它类似于@JsonIgnoreProperties,只是它不包括除列出的属性以外的所有属性,而是排除除列出的属性以外的所有属性 e、 例如,如果注释名为@JsonIncludeProperties: class A { final int a = 1; final int b = 1; ... // final int c = 1; through final int

是否有字段和/或getter的Jackson注释忽略字段值的所有属性(列出的属性除外)

当应用于字段时,它类似于
@JsonIgnoreProperties
,只是它不包括除列出的属性以外的所有属性,而是排除除列出的属性以外的所有属性

e、 例如,如果注释名为
@JsonIncludeProperties

class A {
    final int a = 1;
    final int b = 1;
    ... // final int c = 1; through final int y = 1;
    final int z = 1;
}

class B {
    @JsonProperty
    @JsonIncludeProperties({"m", "o"})
    A a1;
    @JsonProperty
    A a2;
}
将序列化为:

{
    "a1": {
        "m": 1,
        "o": 1
    },
    "a2": {
        "a": 1,
        "b": 1,
        ... // "c": 1, through "y": 1,
        "z": 1
    }
}
您可以使用和自定义注释来实现。以下是一个例子:

public class JacksonIncludeProperties {
    @Retention(RetentionPolicy.RUNTIME)
    @interface JsonIncludeProperties {
        String[] value();
    }

    @JsonFilter("filter")
    @JsonIncludeProperties({"a", "b1"})
    static class Bean {
        @JsonProperty
        public final String a = "a";
        @JsonProperty("b1")
        public final String b = "b";
        @JsonProperty
        public final String c =  "c";
    }

    private static class IncludePropertiesFilter extends SimpleBeanPropertyFilter {

        @Override
        protected boolean include(final PropertyWriter writer) {
            final JsonIncludeProperties includeProperties =
                    writer.getContextAnnotation(JsonIncludeProperties.class);
            if (includeProperties != null) {
                return Arrays.asList(includeProperties.value()).contains(writer.getName());
            }
            return super.include(writer);
        }
    }

    public static void main(String[] args) throws JsonProcessingException {
        final ObjectMapper objectMapper = new ObjectMapper();
        final SimpleFilterProvider filterProvider = new SimpleFilterProvider();
        filterProvider.addFilter("filter", new IncludePropertiesFilter());
        objectMapper.setFilters(filterProvider);
        System.out.println(objectMapper.writeValueAsString(new Bean()));
    }
}

如果您指的是@JsonIncludeProperties,那么它包含在jackson数据绑定库的2.12中。有关这一问题的全部细节在这里。spring boot将在2.5.x版本中提供,请参见此处

是否可以使用不同的
@jsonautodect
帮助设置?谢谢您的建议,但据我所知,
@jsonautodect
对我没有帮助。对于类型为
A
的不同字段,我需要对class
A
的属性进行不同的筛选。IIRC,
@JsonAutoDetect
仅在类级别工作,因此它无法在不同位置对同一类的属性进行不同的筛选。