Java @同一属性上的JsonIgnore和@JsonProperty

Java @同一属性上的JsonIgnore和@JsonProperty,java,json,jackson-databind,Java,Json,Jackson Databind,我需要基于一个自定义的ignore注释忽略Json对象中的某些属性,而我只需要对某个对象映射器使用该注释。但是,对于其他情况,我需要对其进行JsonProperty注释。我正在使用JacksonAnnotationInstrostect来执行此操作。但当我这样做时,两个注释都没有得到确认 例如,我希望我的输出是这样的: 普通对象映射器:{“element3”:“C”,“element_1”:“A”,“element_2”:“B”} 使用对象映射器和JacksonAnnotationInstRos

我需要基于一个自定义的ignore注释忽略Json对象中的某些属性,而我只需要对某个对象映射器使用该注释。但是,对于其他情况,我需要对其进行JsonProperty注释。我正在使用JacksonAnnotationInstrostect来执行此操作。但当我这样做时,两个注释都没有得到确认

例如,我希望我的输出是这样的:

普通对象映射器:
{“element3”:“C”,“element_1”:“A”,“element_2”:“B”}

使用对象映射器和JacksonAnnotationInstRosector:
{“element_1”:“A”}

我实际使用JacksonAnnotationInstrucett获得的输出:
{“element2”:“B”,“element_1”:“A”}

以下是我的代码:

public class TestClass {

    public static void main(String[] args) throws Exception {

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setAnnotationIntrospector(new JsonIgnoreIntrospector());

        MockObject mockObject = new MockObject("A", "B", "C");
        String string = objectMapper.writeValueAsString(mockObject);
        System.out.println(string);
    }

    public static class MockObject {

        @JsonProperty("element_1")
        String element1;

        @CustomJsonIgnore
        @JsonProperty("element_2")
        String element2;

        @CustomJsonIgnore
        String element3;

        public MockObject(String element1, String element2, String element3) {
            this.element1 = element1;
            this.element2 = element2;
            this.element3 = element3;
        }

        public String getElement1() {
            return element1;
        }

        public void setElement1(String element1) {
            this.element1 = element1;
        }

        public String getElement2() {
            return element2;
        }

        public void setElement2(String element2) {
            this.element2 = element2;
        }

        public String getElement3() {
            return element3;
        }

        public void setElement3(String element3) {
            this.element3 = element3;
        }
    }

    public static class JsonIgnoreIntrospector extends JacksonAnnotationIntrospector {
        @Override
        public boolean hasIgnoreMarker(final AnnotatedMember m) {
            return m.hasAnnotation(CustomJsonIgnore.class) || m.hasAnnotation(JsonIgnore.class);
        }

    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.CONSTRUCTOR})
    @JacksonAnnotation
    public @interface CustomJsonIgnore {
    }
}

应该在getter而不是字段上使用注释。并在注释目标中添加方法

工作解决方案:

public class TestClass  {

    public static void main(String[] args) throws Exception {

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setAnnotationIntrospector(new JsonIgnoreIntrospector());

        MockObject mockObject = new MockObject("A", "B", "C");
        String string = objectMapper.writeValueAsString(mockObject);
        System.out.println(string);
    }

    public static class MockObject {

        String element1;

        String element2;

        String element3;

        public MockObject(String element1, String element2, String element3) {
            this.element1 = element1;
            this.element2 = element2;
            this.element3 = element3;
        }

        @JsonProperty("element_1")
        public String getElement1() {
            return element1;
        }

        public void setElement1(String element1) {
            this.element1 = element1;
        }

        @CustomJsonIgnore
        @JsonProperty("element_2")
        public String getElement2() {
            return element2;
        }

        public void setElement2(String element2) {
            this.element2 = element2;
        }

        @CustomJsonIgnore
        public String getElement3() {
            return element3;
        }

        public void setElement3(String element3) {
            this.element3 = element3;
        }
    }

    public static class JsonIgnoreIntrospector extends JacksonAnnotationIntrospector {
        @Override
        public boolean hasIgnoreMarker(final AnnotatedMember m) {
            return m.hasAnnotation(CustomJsonIgnore.class) || m.hasAnnotation(JsonIgnore.class);
        }

    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE,
            ElementType.CONSTRUCTOR })
    @JacksonAnnotation
    public @interface CustomJsonIgnore {
    }
}

我不完全确定我是否理解您的用例。为什么要在忽略的属性上使用名称? 如果问题与反序列化相关,并且由于无法找到具有特定名称的所需属性而导致反序列化失败,则可以将对象映射器配置为忽略未知属性。下面是一个例子

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)