当前位置: 首页 > 知识库问答 >
问题:

Jackson ObjectMapper:如何从序列化中省略(忽略)特定类型的字段?

司立果
2023-03-14

如何告诉 Jackson ObjectMapper 从序列化中忽略特定类型(类)的字段(在我的 Object.class的情况下)?

约束条件:

  • 不控制源类-它是第三方类。
  • 被序列化的类类型是未知的-我猜它取消了MixIn的资格。
  • 此类字段的名称预先未知

为了提供帮助,下面是一个单元测试,期望从序列化中忽略字段对象列表对象字段,但它的方法是不正确的,它是按名称而不是按类型过滤它们。

public static class FavoriteShows {
    public Simpsons favorite = new Simpsons();
    public BigBangTheory preferred = new BigBangTheory();
}

public static class Simpsons {
    public String title = "The Simpsons";

    public List<Object> objectsList = List.of("homer", "simpson");
    public Object objectField = new HashMap() {{
        put("mr", "burns");
        put("ned", "flanders");
    }};
}

public static class BigBangTheory {
    public String title = "The Big Bang Theory";

    public List<Object> objectsList = List.of("sheldon", "cooper");
    public Object objectField = new HashMap() {{
        put("leonard", "hofstadter");
        put("Raj", "koothrappali");
    }};
}

public abstract static class MyMixIn {
    @JsonIgnore
    private Object objectField;
    @JsonIgnore
    private Object objectsList;
}

@Test
public void test() throws JsonProcessingException {
    // GIVEN
    // Right solution must work for any (MixIn(s) is out of questions) Jackson annotated class
    // without its modification.
    final ObjectMapper mapper = new ObjectMapper()
            .addMixIn(Simpsons.class, MyMixIn.class)
            .addMixIn(BigBangTheory.class, MyMixIn.class);

    // WHEN
    String actual = mapper.writeValueAsString(new FavoriteShows());
    System.out.println(actual);

    // THEN
    // Expected: {"favorite":{"title":"The Simpsons"},"preferred":{"title":"The Big Bang Theory"}}
    assertThat(actual).isEqualTo("{\"favorite\":{\"title\":\"The Simpsons\"},\"preferred\":{\"title\":\"The Big Bang Theory\"}}");

}

共有2个答案

端木志诚
2023-03-14

如果你正在使用mixins,你应该能够用@ JsonIgnoreType注释,让它忽略这个类。参考文件全局忽略Jackson中的类

熊博远
2023-03-14

其中一种方法是使用自定义AnnotationINSPECTOR

class A {

    int three = 3;
    int four = 4;
    B b = new B();

    // setters + getters
}

class B {

    int one = 1;
    int two = 2;

    // setters + getters
}

要忽略类型为B的所有字段:

ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
    @Override
    protected boolean _isIgnorable(Annotated a) {
        return super._isIgnorable(a)
                 // Ignore B.class
                 || a.getRawType() == B.class
                 // Ignore List<B>
                 || a.getType() == TypeFactory.defaultInstance()
                       .constructCollectionLikeType(List.class, B.class);
    }
});

String json = mapper.writeValueAsString(new A());
 类似资料:
  • 我有这样的Jackson注释类: 假设我不能更改我的类代码。那么,如何让ObjectMapper只覆盖field2的JsonIgnore并将其序列化为json?但我希望它忽略field4。这很简单,只需要几行代码吗? 我的常规序列化代码:

  • 我需要一些使用MapStruct映射嵌套POJO的帮助。我需要跳过/删除目标类中所有子类的特定字段。 例如,以下是我的目标POJO 所有这些子类——,,。。。包含一个字段“”,我想在映射时忽略它。这种结构使得这些类不共享包含此字段的公共基类——“”。 我创建的映射器如下所示: 这工作。 然而,当中的子类数量很大时,它会变得很乏味。我需要明确指定每个类。 有没有人能告诉我,这是否可以用一种更通用的方

  • 问题内容: 我想序列化一个不受我控制的POJO类,但是想避免序列化任何来自超类而不是最终类的属性。例: 您可以从示例中猜测到,该类是由JOOQ生成的,并且是从复杂的基类UpdatableRecordImpl继承的,该基类还具有一些类似于bean属性的方法,这会在序列化过程中引起问题。另外,我有几个类似的类,因此最好避免对所有生成的POJO复制相同的解决方案。 到目前为止,我已经找到以下可能的解决方

  • > 使用mixin技术忽略来自超类的特定字段,如下所示:我如何告诉jackson忽略一个我无法控制源代码的属性? 这样做的问题是,如果基类发生了变化(例如,其中出现了一个新的getAnything()方法),它可能会破坏我的实现。 实现一个自定义序列化程序并在那里处理问题。这在我看来有点矫枉过正。 但是,从纯设计的角度来看,最好的方法是告诉jackson我只想序列化最终类的属性,而忽略所有继承的属

  • 问题内容: 我有一些扩展的模型类:它们定义用于包装Map的get和put方法的getter和setter。我正在尝试使用Jackson(带有RESTEasy)序列化这些类的实例,但是Jackson拒绝注意我的getter(使用注释)。而是仅序列化支持映射的键- 值对。我尝试使用禁用所有方法和字段的自动检测功能,但这并没有任何改变。有没有办法防止Jackson序列化Map,还是必须创建不扩展的新模型

  • 考虑一个案例,我有2个对象映射器实例。我希望必须从序列化中排除使用某些自定义注释注释的字段,而其他映射器包含(忽略注释) 就像类有3个字段a,b,c和c用一些注释注释(比如@IgnoreField)(它们的n个类,每个类都有它们不应该被序列化的字段) 现在,第一个对象映射器 o1 必须仅序列化 a 和 b。而第二个对象映射器o2可以序列化a,b和c。 任何具有不同字段的类都可能发生这种情况,其中一