2012-06-14 4 views
4

У меня есть следующие объекты:Фильтр вложенных объектов с помощью Джексона BeanPropertyFilter

@JsonFilter("myFilter") 
public class Person { 
    private Name name; 
    private int age; 
    public Name getName() {return name;} 
    public void setName(Name name) {this.name = name;} 
    public int getAge() {return age;} 
    public void setAge(int age) {this.age = age;} 
} 

@JsonFilter("myFilter") 
public class Name { 
    private String firstName; 
    private String lastName; 
    public String getFirstName() {return firstName;} 
    public void setFirstName(String firstName) {this.firstName = firstName;} 
    public String getLastName() {return lastName;} 
    public void setLastName(String lastName) {this.lastName = lastName;} 

} 

Я написал метод Маршаллу объект Person, как это:

@Test 
public void test() throws Exception { 

    Person person = new Person(); 
    person.setAge(10); 
    Name name = new Name(); 
    name.setFirstName("fname"); 
    name.setLastName("lastname"); 
    person.setName(name); 

    ObjectMapper mapper = new ObjectMapper(); 

    FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", 
      SimpleBeanPropertyFilter.filterOutAllExcept("name.firstName")); 

    System.out.println(mapper.filteredWriter(filters).writeValueAsString(person)); 

} 

То, что я хотел бы видеть это JSON например:

{"name":{"firstName":"fname"}} 

Возможно ли это?

ответ

5

Хорошо, понял. Варгард сделал бы это немного красивее, но хорошо. Надеюсь, у меня нет двух внутренних бобов, у которых есть свойства с тем же именем. Я не смог бы провести различие между двумя

FilterProvider filters = new SimpleFilterProvider() 
      .addFilter("myFilter", SimpleBeanPropertyFilter 
        .filterOutAllExcept(new HashSet<String>(Arrays 
          .asList(new String[] { "name", "firstName" })))); 
+1

Да Джексон, кажется, не быть (легкий) способ поднять график к свойствам ancelstors, поэтому вы не смогли создать полное имя свойства для проверки. Как вы указали, это сломается для более сложных классов (например, вы не могли бы включить только «person.id», если бы было поле «person.employer.id» ... вы бы сериализовали любое поле на графике который был назван «id» или «работодателем». – NobodyMan

1

Существует лучший способ решить проблему с конфликтами имен свойств. Просто добавьте еще один фильтр для класса Name («nameFilter»):

@JsonFilter("personFilter") 
public class Person { 
    private Name name; 
    private int age; 
    public Name getName() {return name;} 
    public void setName(Name name) {this.name = name;} 
    public int getAge() {return age;} 
    public void setAge(int age) {this.age = age;} 
} 

@JsonFilter("nameFilter") 
public class Name { 
    private String firstName; 
    private String lastName; 
    public String getFirstName() {return firstName;} 
    public void setFirstName(String firstName) {this.firstName = firstName;} 
    public String getLastName() {return lastName;} 
    public void setLastName(String lastName) {this.lastName = lastName;} 
} 

, а затем добавить 2 фильтра, один для лица и один для Имя:

FilterProvider filterProvider = new SimpleFilterProvider() 
      .addFilter("personFilter", SimpleBeanPropertyFilter.filterOutAllExcept("name")) 
      .addFilter("nameFilter", SimpleBeanPropertyFilter.filterOutAllExcept("firstName")); 
Смежные вопросы