我可能知道如何忽略声明它的类中的一些成员变量。例如,下面是3个类,PersonalInfo
并由AcedemicInfo
和FamilyInfo
声明。
public class PersonalInfo {
@JsonPropetry
private String name;
@JsonPropetry
String universityName;
@JsonPropetry
private String motherName;
@JsonPropetry
private String fatherName;
/* Set and Get*/
}
public class AcademicInfo {
@JsonPropetry
private PersonalInfo info; // need name and university only
/* Set and Get*/
}
public class FamilyInfo {
@JsonPropetry
private PersonalInfo info; // need name and fatherName and motherName only
/* Set and Get*/
}
但是,我需要忽略PersonalInfo
的某些成员变量,因为AcedemicInfo
和FamilyInfo
不需要PersonalInfo
中的所有属性。
以下是我想要的输出
// Acedemic info json
{
"info" : {
"name":"Adam",
"universityName":"University"
}
}
// Family info json
{
"info" : {
"name":"Adam",
"fatherName":"Matt"
"motherName":"Jane"
}
}
我知道@JsonIgnore
,但是如果我将注释放在PersonalInfo
类中,那么变量将被声明它的所有类忽略,这不是我想要的。我可以知道如何有条件地忽略变量吗?抱歉我的英语不好。
答案 0 :(得分:0)
一种方法是将@JsonFilter
与SimpleFilterProvider
和SimpleBeanPropertyFilter
一起使用,以排除不要序列化的属性。
您的课程如下所示:
public class AcademicInfo {
@JsonFilter("academicPersonalInfoFilter")
private PersonalInfo info;
}
以及序列化对象的示例:
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("academicPersonalInfoFilter",
SimpleBeanPropertyFilter.serializeAllExcept("motherName", "fatherName"));
ObjectMapper mapper = new ObjectMapper();
mapper.setFilters(filterProvider);
mapper.writeValueAsString(academicInfo);
另一种方法是使用多个@JsonView
来定义一组要序列化的属性。
在这种情况下,您可以定义如下视图:
public class Views {
public static class BasicPersonalInfo {
}
public static class AcademicPersonalInfo extends BasicPersonalInfo {
}
public static class FamilyPersonalInfo extends BasicPersonalInfo {
}
}
并在相应的视图中注释要序列化的字段:
public class PersonalInfo {
@JsonView(Views.BasicPersonalInfo.class)
private String name;
@JsonView(Views.AcademicPersonalInfo.class)
String universityName;
@JsonView(Views.FamilyPersonalInfo.class)
private String motherName;
@JsonView(Views.FamilyPersonalInfo.class)
private String fatherName;
}
并序列化对象如下:
String result = mapper.writerWithView(Views.AcademicPersonalInfo.class)
.writeValueAsString(academicInfo);