【问题标题】:Globally ignore class in Jackson杰克逊的全球无视课堂
【发布时间】:2014-09-02 02:00:29
【问题描述】:

Jackson 能够使用DeserializationFeature 全局跳过未知属性,但我找不到任何全局配置来忽略整个类的解析。我有两个具有相同名称但具有不同参数的方法的类,因此我想将此类设置为全局可忽略(使用 objectMapper 对象),而不仅仅是向模型类添加任何注释。可能有人面临这样的问题。

抱歉英语不好。

【问题讨论】:

  • 你尝试过 MixIns 吗?在 JacksonObjectMapper 中使用 addMixInAnnotations 方法。
  • 我不知道全局解决方案;我的第一个猜测是标记字段(具有这种类型)transient,让杰克逊忽略它们。
  • @UweAllner,尝试添加 addMixInAnnotations 没有帮助
  • 在所有类中忽略所有具有特定类型参数的“setter”属性方法是什么?
  • @AlexeyGavrilov,将两种方法中的一种设置为可忽略会很棒。但我认为这很难做到(可能无法通过 ObjectMapper 在全球范围内做到这一点)。所以我想知道,是否有可能忽略整个这门课,让杰克逊在编组和解组期间跳过这门课。

标签: java jackson


【解决方案1】:

一种选择是使用@JsonIgnoreType 注释标记您希望忽略的类型。如果你不想用 Jackson 注释弄乱你的模型,你可以使用mix-ins

另一个选项是覆盖the Jackson annotation introspector 以根据其类型忽略该属性。

下面是两个例子:

public class JacksonIgnoreByType {
    public static final String JSON = "{\n" +
            "  \"bean1\" : {\n" +
            "    \"field1\" : \"value1\"\n" +
            "  },\n" +
            "  \"bean2\" : {\n" +
            "    \"field2\" : \"value2\"\n" +
            "  },\n" +
            "  \"bean3\" : {\n" +
            "    \"field3\" : \"value3\"\n" +
            "  }\n" +
            "}\n";

    public static class Bean1 {
        public String field1;

        @Override
        public String toString() {
            return "Bean1{" +
                    "field1='" + field1 + '\'' +
                    '}';
        }
    }

    @JsonIgnoreType
    public static class Bean2 {
        public String field2;
    }

    public static class Bean3 {
        public String field3;
    }

    public static class Bean4 {
        public Bean1 bean1;
        public Bean2 bean2;
        public Bean3 bean3;

        @Override
        public String toString() {
            return "Bean4{" +
                    "bean1=" + bean1 +
                    ", bean2=" + bean2 +
                    ", bean3=" + bean3 +
                    '}';
        }
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector(){
            @Override
            public boolean hasIgnoreMarker(AnnotatedMember m) {
                return m.getRawType() == Bean3.class || super.hasIgnoreMarker(m);
            }
        });

        System.out.println(mapper.readValue(JSON, Bean4.class));
    }
}

输出:

Bean4{bean1=Bean1{field1='value1'}, bean2=null, bean3=null}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2014-02-12
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多