我正在使用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,但我希望它可以做得更简单,而且我不确定我是否可以这样做,因为我无法改变超类它在外部图书馆。
答案 0 :(得分:11)
@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。