我试图使用以下(简化)代码通过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"}

如何创建一个尊重指定过滤器的临时编写器(在我的情况下,无法重新配置ObjectMapper)。

注意:由于我的应用程序中的使用场景,我只能接受不使用Jackson批注的答案。

最佳答案

通常,您可以注释Data类以应用过滤器:

@JsonFilter("test")
class Data {

您已指定不能在类上使用批注。您可以使用混入来避免注释Data类。
@JsonFilter("test")
class DataMixIn {}

ObjectMapper上指定Mixins have to,并且您指定不想重新配置它。在这种情况下,您始终可以复制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"}

10-07 12:43
查看更多