2016-07-16 8 views
0

Могу я узнать, как игнорировать некоторые переменные-члены из класса, объявившего его. Например, ниже представлены 3 класса, которые являются PersonalInfo и объявлены AcedemicInfo и FamilyInfo.Игнорировать часть переменной объявленного объекта при сериализации в JSON?

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

Вы попробовали @ JsonIgnore? – Rustam

+0

@JsonIgnore должен решить это для вас – user3765370

+0

@ Rustam, Да, я пробовал это. Но я не знаю, как применить его в моем случае. Может ли '@ JsonIgnore' применяться условно или зависит от того, какой класс его вызывает? – karfai

ответ

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

Спасибо, что ответили на мой вопрос. Тем не менее, я передаю свой «объект» в 'ResponseEntity.ok(). Body (object)'. Могу ли я узнать, где можно применить '@ JsonFilter' или' @ JsonView'? У вас есть представление об этом? – karfai

+0

О '@ JsonView', вы можете взглянуть на https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring – Wilson

+0

Спасибо за вашу ссылку, теперь я фигура как это сделать весной. И также жаль, что я не упомянул весну в моем вопросе. '@ JsonView' для сериализации и десериализации, которые экономят время на создание меньших классов. – karfai

Смежные вопросы