杰克逊:使用过滤时空的嵌套实体

时间:2015-11-05 13:05:43

标签: java json serialization jackson

我有代码使用filterOutAllExcept

来序列化对象中的某些字段
FilterProvider newF = new SimpleFilterProvider().addFilter(
    "filter properties by name",
    SimpleBeanPropertyFilter.filterOutAllExcept(fields2Show)
);
writer = mapper.writer(newF);

fiels2Shownull时,上面的代码未运行,不会应用过滤器,我会正确获得嵌套对象,如下所示:

[ {
  "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时,事情就会出现严重错误。设fields2ShowSet<String>,其中只包含一个字符串&#34; record_types&#34;。然后我得到这样的结果:

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

为什么?

1 个答案:

答案 0 :(得分:1)

SimpleBeanPropertyFilter的javadoc非常明确:

  

仅使用属性名称的简单PropertyFilter实现   确定是按顺序序列化属性,还是将其过滤掉。

很明显,过滤器会忽略属性层次结构。描述如下:

  

使用此类作为任何自定义的基本实现   强烈鼓励PropertyFilter实现,因为它可以   为可能添加的任何方法提供默认实现   PropertyFilter(不如添加可能)。

提示如果想要扩展默认的简化行为,那么应该扩展此类并创建自定义过滤器。

检查上述课程的javadoc,我得出了以下结论:

  1. filterOutAllExcept()方法是一个工厂方法,它返回一个覆盖抽象include()方法的实现。这些方法可以访问一个属性,而不是完整的bean(或POJO)对象。

  2. 但是,该类还包含一个serializeAsField()方法,它接收对象并可以推断出属性的层次结构。

  3. 总之,我认为你应该编写一个扩展简单过滤器的新类,并实现serializeAsField()以产生所需的结果。