一尘不染

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

json

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

例如:

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

    private String firstName;

    private String lastName;
}

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


阅读 239

收藏
2020-07-27

共1个答案

一尘不染

您可以使用混入@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);
}
2020-07-27