Глобальный фильтр свойств в Джексоне - PullRequest
7 голосов
/ 23 ноября 2011

Есть ли способ зарегистрировать глобальный фильтр свойств в ObjectMapper? Глобальный означает, что он будет применен ко всем сериализованным компонентам. Я не могу использовать аннотации (я не могу модифицировать сериализованные компоненты) и не знаю, какими свойствами обладают компоненты. Фильтрация должна основываться на имени.

Моей первой идеей было написать собственный сериализатор, но я не знаю, что мне передать конструктору.

1 Ответ

11 голосов
/ 23 ноября 2011

Я бы использовал FilterProvider.Это немного сложно, но не слишком громоздко.

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;
import org.codehaus.jackson.map.annotate.JsonFilter;
import org.codehaus.jackson.map.ser.FilterProvider;
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    Bar bar = new Bar();
    bar.id = "42";
    bar.name = "James";
    bar.color = "blue";
    bar.foo = new Foo();
    bar.foo.id = "7";
    bar.foo.size = "big";
    bar.foo.height = "tall";

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);
    System.out.println(mapper.writeValueAsString(bar));
    // output: 
    // {"id":"42","name":"James","color":"blue","foo":{"id":"7","size":"big","height":"tall"}}

    String[] ignorableFieldNames = { "id", "color" };

    FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames));

    mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);
    mapper.getSerializationConfig().addMixInAnnotations(Object.class, PropertyFilterMixIn.class);
    ObjectWriter writer = mapper.writer(filters);

    System.out.println(writer.writeValueAsString(bar));
    // output:
    // {"name":"James","foo":{"size":"big","height":"tall"}}
  }
}

@JsonFilter("filter properties by name")
class PropertyFilterMixIn
{

}

class Bar
{
  String id;
  String name;
  String color;
  Foo foo;
}

class Foo
{
  String id;
  String size;
  String height;
}

Для других подходов и дополнительной информации я рекомендую следующие ресурсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...