@JsonIgnore和@JsonProperty在同一属性上

时间:2017-08-24 07:54:13

标签: java json jackson-databind

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

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

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

使用带有JacksonAnnotationInstrospector的Object mapper的预期输出:{"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 {
    }
}

2 个答案:

答案 0 :(得分: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 {
    }
}

答案 1 :(得分:0)

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

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)