杰克逊忽略外部库中超类的所有属性
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);
}
我正在使用 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);
}