Jackson的全球财产过滤器

时间:2011-11-22 23:14:33

标签: json jackson

有没有办法在ObjectMapper中注册全局属性过滤器? 全局意味着它将应用于所有序列化bean。我不能使用注释(我无法修改序列化的bean)并且不知道bean具有哪些属性。 过滤应该是基于名称的。

我的第一个想法是编写自定义序列化程序,但我不知道应该将哪些内容传递给构造函数。

1 个答案:

答案 0 :(得分:11)

我会使用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;
}

对于其他方法和更多信息,我建议使用以下资源。