2015-11-05 3 views
0

У меня есть код serialiaze только определенные поля в объекте, используя filterOutAllExcept:Джексон: пустые вложенные объекты при использовании фильтрации

FilterProvider newF = new SimpleFilterProvider().addFilter(
    "filter properties by name", 
    SimpleBeanPropertyFilter.filterOutAllExcept(fields2Show) 
); 
writer = mapper.writer(newF); 

Когда fiels2Show является null, выше код не запускать, фильтр не применяется, и я получить вложенные объекты правильно, что-то вроде этого:

[ { 
    "phone" : null, 
    "duration" : 1200000, 
    "unique_id" : "376_1244", 
    "id" : 1244, 
    "record_types" : [ { 
    "customer_id" : 376, 
    "max_age" : 20, 
    "min_age" : 10, 
    "id" : 15351, 
    "entity_type" : "CalendarRecordType" 
    }, { 
    "customer_id" : 376, 
    "max_age" : 30, 
    "min_age" : 10, 
    "id" : 15352, 
    "entity_type" : "CalendarRecordType" 
    } ] 
} ] 

Но когда fields2Show установлен, как-то все идет не так. Пусть fields2Show будет Set<String>, который содержит только одну строку "record_types". Затем я получаю такой результат:

[ { 
    "record_types" : [ { }, { } ] 
} ] 

Почему?

+0

результат в точности соответствует ожидаемому: все отфильтровано, кроме "record_types". в чем проблема? –

+0

@sharonbn Проблема в том, что «record_types» теперь является массивом пустых объектов, а не сериализован. На самом деле бесполезно. –

ответ

1

документация Javadoc для SimpleBeanPropertyFilter совершенно ясно:

Простая реализация PropertyFilter, что использует только имя свойства для определить, является ли сериализовать свойство, как есть, или отфильтровать его.

Очевидно, что фильтр игнорирует иерархию свойств. Описание продолжается:

Использования этого класса в качестве базовой реализации для любых реализаций PropertyFilter пользовательских настоятельно рекомендуется, поскольку она может обеспечить реализацию по умолчанию для любых методов, которые могут быть добавлены в PropertyFilter (как неудачно, как дополнения могут быть).

Какие намеки на то, что если вы хотите расширить упрощенное поведение по умолчанию, то следует расширить этот класс и создать настраиваемый фильтр.

Рассматривая Javadoc из вышеназванного класса, я пришел к выводам на следующем:

  1. Метод filterOutAllExcept() является фабричным методом, который возвращает реализацию, которая переопределяет абстрактные include() метод. Эти методы имеют доступ к одному свойству, а не ко всему объекту (POJO).

  2. Однако класс также содержит метод serializeAsField(), который получает объект и может выводить иерархию свойств.

В заключении, я думаю, вы должны написать новый класс, который расширяет простой фильтр и осуществлять serializeAsField() для получения требуемого результата.

+0

Ох. Не выглядит быстрым и простым решением. Во всяком случае, может быть, кто-то заинтересовался бы реализацией. –