当前位置: 首页 > 面试题库 >

Jackson从外部库中忽略超类的所有属性

华景明
2023-03-14
问题内容

我正在使用ORM进行开发,在其中我扩展了基orm类来创建表。

例如:

public class Person extends DbItem {
    @JsonIgnore
    private String index;

    private String firstName;

    private String lastName;
}

问题是,当我使用ObjectMapper进行序列化时,它将尝试序列化DbItem类的成员。有没有简单的方法可以防止这种情况?例如带有注释。

我看过一个类似的问题,杰克逊序列化:如何忽略超类属性,但我希望可以将其简化,而且我不确定是否可以这样做,因为我无法更改超类,因为它位于外部库。


问题答案:

您可以使用混入或@JsonIgnoreProperties

对于这些示例,假定基本的ORM类和扩展名是:

public class DbItem {
    public String dbPropertyA;
    public String dbPropertyB;
}

public class Person extends DbItem {
    public String index;
    public String firstName;
    public String lastName;
}

分别。

使用混入

混合是杰克逊从对象本身理解的反序列化指令的抽象。这是自定义第三方类的反序列化的一种方法。为了定义混入,必须创建一个抽象类并向中注册ObjectMapper

混合定义示例

public abstract class PersonMixIn {
    @JsonIgnore public String dbPropertyA;
    @JsonIgnore public String dbPropertyB;
    @JsonIgnore public String index;
}

注册混音

@Test
public void serializePersonWithMixIn() throws JsonProcessingException {
    // set up test data including parent properties
    Person person = makeFakePerson();

    // register the mix in
    ObjectMapper om = new ObjectMapper()
            .addMixIn(Person.class, PersonMixIn.class);

    // translate object to JSON string using Jackson
    String json = om.writeValueAsString(person);

    assertFalse(json.contains("dbPropertyA"));
    assertFalse(json.contains("dbPropertyB"));
    assertFalse(json.contains("index"));
    System.out.println(json);
}

@JsonIgnoreProperties

如果要避免创建类并配置ObjectMapper@JsonIgnoreProperties可以使用注释。只需注释要序列化的类并列出要排除的属性。

示例可序列化对象

@JsonIgnoreProperties({"index", "dbPropertyA", "dbPropertyB"})
public class Person extends DbItem {
    public String index;
    public String firstName;
    public String lastName;
}

实际观看

@Test
public void serializePersonWithIgnorePropertiesAnnotation() throws JsonProcessingException {
    // set up test data including parent properties
    Person person = makeFakePerson();

    ObjectMapper om = new ObjectMapper();

    // translate object to JSON string using Jackson
    String json = om.writeValueAsString(person);

    assertFalse(json.contains("dbPropertyA"));
    assertFalse(json.contains("dbPropertyB"));
    assertFalse(json.contains("index"));
    System.out.println(json);
}


 类似资料:
  • 例如: 问题是,当我使用ObjectMapper进行序列化时,它会尝试序列化DbItem类的成员。有没有什么简单的方法可以预防呢?例如使用注释。 我看过一个类似的问题Jackson序列化:如何忽略超类属性,但我希望它可以做得更简单,我不确定我是否可以这样做,因为我不能更改超类,因为它在一个外部库中。

  • 问题内容: 我正在使用ORM进行开发,在其中我扩展了基本orm类来创建表。 例如: 问题是,当我使用ObjectMapper进行序列化时,它将尝试序列化DbItem类的成员。有没有简单的方法可以防止这种情况?例如带有注释。 问题答案: 您可以使用混入或 就这些示例而言,假定基本的ORM类和扩展名是: 和 分别。 使用混入 混合是杰克逊从对象本身理解的反序列化指令的抽象。这是自定义第三方类的反序列化

  • 我的目标是将jsonObject转换为Class。我只想添加在类中批注的字段。例如:json 对象包含 50 个字段。类有 4 个字段。我只想映射精确的4个字段,而不在类中添加46个加法忽略。 JSON: 类: 用户类没有地址字段。我的目标是排除它,因为它没有注释。

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

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

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