我有代码使用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>
,其中只包含一个字符串&#34; record_types&#34;。然后我得到这样的结果:
[ {
"record_types" : [ { }, { } ]
} ]
为什么?
答案 0 :(得分:1)
SimpleBeanPropertyFilter的javadoc非常明确:
仅使用属性名称的简单PropertyFilter实现 确定是按顺序序列化属性,还是将其过滤掉。
很明显,过滤器会忽略属性层次结构。描述如下:
使用此类作为任何自定义的基本实现 强烈鼓励PropertyFilter实现,因为它可以 为可能添加的任何方法提供默认实现 PropertyFilter(不如添加可能)。
提示如果想要扩展默认的简化行为,那么应该扩展此类并创建自定义过滤器。
检查上述课程的javadoc,我得出了以下结论:
filterOutAllExcept()
方法是一个工厂方法,它返回一个覆盖抽象include()
方法的实现。这些方法可以访问一个属性,而不是完整的bean(或POJO)对象。
但是,该类还包含一个serializeAsField()
方法,它接收对象并可以推断出属性的层次结构。
总之,我认为你应该编写一个扩展简单过滤器的新类,并实现serializeAsField()
以产生所需的结果。