在序列化为JSON时忽略声明对象的一些变量?

时间:2016-07-16 13:33:36

标签: java json jackson

我可能知道如何忽略声明它的类中的一些成员变量。例如,下面是3个类,PersonalInfo并由AcedemicInfoFamilyInfo声明。

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的某些成员变量,因为AcedemicInfoFamilyInfo不需要PersonalInfo中的所有属性。

以下是我想要的输出

// Acedemic info json
{
    "info" : {
        "name":"Adam",
        "universityName":"University"
        }
}

// Family info json
{
    "info" : {
        "name":"Adam",
        "fatherName":"Matt"
        "motherName":"Jane"
        }
}

我知道@JsonIgnore,但是如果我将注释放在PersonalInfo类中,那么变量将被声明它的所有类忽略,这不是我想要的。我可以知道如何有条件地忽略变量吗?抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

一种方法是将@JsonFilterSimpleFilterProviderSimpleBeanPropertyFilter一起使用,以排除不要序列化的属性。

您的课程如下所示:

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);