使用JsonFilter

时间:2019-08-24 07:16:09

标签: java spring spring-boot serialization pojo

我正在尝试在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属性并还给我< / p>

任何对此的建议都会有很大帮助。预先感谢

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

是的,我们可以动态决定并创建通用过滤器。

        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        FilterProvider filters = new SimpleFilterProvider().setFailOnUnknownId(false).addFilter("CustomerFilter",
                SimpleBeanPropertyFilter.filterOutAllExcept("customerId"));
        ObjectWriter writer = mapper.writer(filters);
        String writeValueAsString = writer.writeValueAsString(customer);
        Customer resultCustomer = mapper.readValue(writeValueAsString, Customer.class);
        return ResponseEntity.status(HttpStatus.OK).body(resultCustomer); 

在上面创建过滤器的代码片段中,您可以将集合作为输入传递。检查下面的片段 根据您的要求,接受 set 作为方法输入,其中有时包含 x,y,有时包含 w,x。

FilterProvider filters = new SimpleFilterProvider().setFailOnUnknownId(false).addFilter("CustomerFilter",
                    SimpleBeanPropertyFilter.filterOutAllExcept(set));