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

时间:2015-04-14 14:43:06

标签: java json inheritance jackson

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

例如:

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

    private String firstName;

    private String lastName;
}

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

我看了一个类似的问题Jackson serialization: how to ignore superclass properties,但我希望它可以做得更简单,而且我不确定我是否可以这样做,因为我无法改变超类它在外部图书馆。

2 个答案:

答案 0 :(得分:11)

您可以使用Mix-in@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;
}

分别

使用混合

混合是杰克逊从对象本身理解的de /序列化指令的抽象。这是一种自定义第三方类的序列化的方法。为了定义混合,必须创建一个抽象类并使用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);
}

答案 1 :(得分:0)

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