首页 > 解决方案 > Spring中使用JsonFilter进行动态序列化

问题描述

我正在尝试在 Spring Boot 2 中动态序列化给定的 POJO。我的用例是,我有一个非常大的模型文件,我只想检索字段的一个子集。我在互联网上找到的方法是使用@JacksonFilter,即用@JsonFilter 注释POJO,并在序列化时使用该过滤器名称。

下面是代码示例

@JsonFilter("myfilter")
class Resource1{
  String firstName;
  String lastName;
  Address address;
}

class Address {
 String addr1;
 String addr2;
 String zipcode;
}

在序列化时,如果我只想要名字,我会这样做

SimpleFilterProvider filterProvider = SimpleFilterProvider()
filterProvider.addFilter("myfilter", 
SimpleBeanPropertyFilter.filterOutAllExcept("firstName"))

ObjectMapper mapper = ObjectMapper()
mapper.setFilterProvider(filterProvider)
mapper.writeValueAsString(resource1_instance) // Resource 1 instance

现在例如,我想过滤另一个 POJO,我需要为给定的类声明 JsonFilter,并且对于任何给定的 POJO 重复此操作。

我担心的是,为了仅动态序列化字段的子集,对于每个给定的 POJO,我们需要添加 @JsonFilter("suitable_name") 并对其进行序列化。

有没有办法声明一个通用的 @JsonFilter 并像继承概念一样重用它。

如果我使用@JsonIgnore,那将是静态且固定的。

我的要求是,如果模型具有 v、w、x、y、z 属性,并且我在运行时仅请求 x、y 属性,那么通用过滤器将仅序列化 POJO 的 x、y 属性并返回给我

对此的任何建议都会有很大帮助。提前致谢

标签: javaspringspring-bootserializationpojo

解决方案


对于更简单用例的动态过滤,我为杰克逊编写了一个插件以使用 antpath 样式过滤。它应该正是您搜索的内容。

https://github.com/Antibrumm/jackson-antpathfilter


推荐阅读