1

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

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

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

使用带有 JacksonAnnotationInstrospector 的对象映射器的预期输出:{"element_1":"A"}

我实际使用 JacksonAnnotationInstrospector 得到的输出:{"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 {
    }
}
4

2 回答 2

1

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

工作解决方案:

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 {
    }
}
于 2017-08-24T09:50:22.073 回答
0

我不完全确定我是否了解您的用例。为什么您需要在您忽略的属性上命名?如果问题与反序列化有关并且反序列化失败,因为它找不到具有特定名称的所需属性,您可以将对象映射器配置为忽略未知属性。示例如下。

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
于 2021-05-05T20:39:43.593 回答