我试图通过SimpleBeanPropertyFilter使用以下(简化)代码从序列化中筛选出某些字段:
SimpleBeanPropertyFilter
public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); SimpleFilterProvider filterProvider = new SimpleFilterProvider().addFilter("test", SimpleBeanPropertyFilter.filterOutAllExcept("data1")); try { String json = mapper.writer(filterProvider).writeValueAsString(new Data()); System.out.println(json); // output: {"data1":"value1","data2":"value2"} } catch (JsonProcessingException e) { e.printStackTrace(); } } private static class Data { public String data1 = "value1"; public String data2 = "value2"; }
我们使用的SimpleBeanPropertyFilter.filterOutAllExcept("data1"));我一直期望创建的序列化Json字符串仅包含{"data1":"value1"},但是我得到了{"data1":"value1","data2":"value2"}。
SimpleBeanPropertyFilter.filterOutAllExcept("data1"));
{"data1":"value1"}
{"data1":"value1","data2":"value2"}
如何创建一个尊重指定过滤器的临时编写器(在我的情况下,无法重新配置ObjectMapper)。
注意:由于我的应用程序中的使用场景,我只能接受不使用Jackson批注的答案。
通常,您Data可以对您的类进行注释以应用过滤器:
Data
@JsonFilter("test") class Data {
您已指定不能在类上使用批注。您可以使用混入来避免注释Data类。
@JsonFilter("test") class DataMixIn {}
必须在上指定Mixins ,ObjectMapper并且您指定不想重新配置它。在这种情况下,您始终可以复制ObjectMapper及其配置,然后修改副本的配置。这不会影响ObjectMapper代码中其他地方使用的原始文件。例如
ObjectMapper
ObjectMapper myMapper = mapper.copy(); myMapper.addMixIn(Data.class, DataMixIn.class);
然后用新的 ObjectMapper
String json = myMapper.writer(filterProvider).writeValueAsString(new Data()); System.out.println(json); // output: {"data1":"value1"}