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

sim*_*nes 8 java inheritance json jackson

我正在使用ORM进行开发,我扩展了一个基础orm类来创建表.

例如:

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

    private String firstName;

    private String lastName;
}
Run Code Online (Sandbox Code Playgroud)

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

我看了一下类似的问题杰克逊序列化:如何忽略超类属性,但我希望它可以做得更简单,我不确定我是否可以这样做因为我不能改变超类,因为它是在一个外部图书馆.

Sam*_*rry 11

你可以使用混合@JsonIgnoreProperties

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

public class DbItem {
    public String dbPropertyA;
    public String dbPropertyB;
}
Run Code Online (Sandbox Code Playgroud)

public class Person extends DbItem {
    public String index;
    public String firstName;
    public String lastName;
}
Run Code Online (Sandbox Code Playgroud)

分别.

使用混合

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

示例混合定义

public abstract class PersonMixIn {
    @JsonIgnore public String dbPropertyA;
    @JsonIgnore public String dbPropertyB;
    @JsonIgnore public String index;
}
Run Code Online (Sandbox Code Playgroud)

注册混合

@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);
}
Run Code Online (Sandbox Code Playgroud)

@JsonIgnoreProperties

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

示例可序列化对象

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

看它在行动

@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);
}
Run Code Online (Sandbox Code Playgroud)