杰克逊忽略外部库中超类的所有属性

Jackson ignore all properties of superclass from external library

我正在使用 ORM 进行开发,我在其中扩展基本 orm class 以创建表。

例如:

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

    private String firstName;

    private String lastName;
}

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

我看过类似的问题Jackson serialization: how to ignore superclass properties,但我希望它可以做得更简单,但我不确定我是否可以做到,因为我无法更改 superclass 因为它在外部库中。

您想进行自定义字段级序列化。这将需要更多的工作来维护您的代码库,但这是迄今为止最简单的解决方案。有关实施细节,请参阅 Jackson JSON custom serialization for certain fields

您可以使用 Mix-in or @JsonIgnoreProperties

出于这些示例的目的,基本 ORM class 和扩展假定为:

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

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

分别

使用混音

Mix-in 是 Jackson 从对象本身理解的 de/serialization 指令的抽象。这是一种自定义 de/serialization 的第 3 方 classes 的方法。为了定义一个混合,必须创建一个抽象 class 并注册到 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

如果您想避免创建 class 和配置 ObjectMapper,可以使用 @JsonIgnoreProperties 注释。只需注释您正在序列化的 class 并列出要排除的属性。

示例可序列化对象

@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);
}