杰克逊筛选出不带批注的字段

2022-09-02 23:01:28

我试图通过使用以下(简化)代码从序列化中过滤掉某些字段: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";
}

我们使用我们,我期望创建的序列化Json字符串仅包含,但是我得到.SimpleBeanPropertyFilter.filterOutAllExcept("data1"));{"data1":"value1"}{"data1":"value1","data2":"value2"}

如何创建遵循指定筛选器的临时编写器(在我的情况下,无法重新配置 ObjectMapper)。

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


答案 1

如果由于某种原因MixIns不适合你。您可以尝试以下方法:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector(){
    @Override
    public boolean hasIgnoreMarker(final AnnotatedMember m) {

    List<String> exclusions = Arrays.asList("field1", "field2");
    return exclusions.contains(m.getName())|| super.hasIgnoreMarker(m);
    }
});

答案 2

您通常会对类进行批注以应用筛选器:Data

@JsonFilter("test")
class Data {

您已指定不能在类上使用批注。您可以使用混音来避免对类进行批注。Data

@JsonFilter("test")
class DataMixIn {}

Mixins必须在 上指定,并且您指定您不想重新配置它。在这种情况下,您始终可以复制 及其配置,然后修改副本的配置。这不会影响代码中其他位置使用的原始代码。例如:ObjectMapperObjectMapperObjectMapper

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"}