Custom Logic to Include or Exclude Fields With @JsonFilter and SimpleBeanPropertyFilter

In this article, we’ll delve into the usage of SimpleBeanPropertyFilter in Jackson, a feature that allows you to filter and control the properties included in the JSON output during serialization. This filter provides fine-grained control over which properties are included, making it useful for customizing your JSON output.

What is SimpleBeanPropertyFilter?

SimpleBeanPropertyFilter is a class in Jackson that lets you define which properties of an object should be included or excluded during JSON serialization. This filter provides a flexible and powerful mechanism to fine-tune the JSON output based on our specific needs.

How to Use SimpleBeanPropertyFilter

To utilize SimpleBeanPropertyFilter, follow these steps:

  • Create a custom filter by extending SimpleBeanPropertyFilter and overriding its serializeAsField method. In this method, you can specify the conditions under which a property should be included or excluded.
  • Register the custom filter with an ObjectMapper using the addFilter method and specifying the filter ID.
  • Annotate your class or fields with @JsonFilter and provide the filter ID you used in step 2.
 java class Person {

        private Long id;
        private String name;
        private String dateOfBirth;
        private String city;
        // Constructors, getters, and setters (not shown for brevity)
    }

    public class CustomPropertyFilter extends SimpleBeanPropertyFilter {
        @Override
        public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer)
                throws Exception {
            if (writer.getName().equals("name")) {
                super.serializeAsField(pojo, jgen, provider, writer);
            }
        }
    }

    //...
    public static void main(String[] args) throws IOException {
        Person person = new Person(1L, "Alice", "2022-09", "New York");
        ObjectMapper objectMapper = new ObjectMapper();
        FilterProvider filters = new SimpleFilterProvider().addFilter("personFilter", new CustomPropertyFilter());
        String json = objectMapper.writer(filters).writeValueAsString(person);
        System.out.println("Serialized Person: " + json);
    }

In this example, we’ve created a custom SimpleBeanPropertyFilter called CustomPropertyFilter that includes only the name field during serialization. The @JsonFilter(“personFilter”) annotation is applied to the Person class, specifying the filter ID.

Serialized Person: {"name":"Alice"}

When to Use SimpleBeanPropertyFilter

SimpleBeanPropertyFilter is particularly useful in scenarios where we need fine-grained control over the properties included in the JSON output. We might want to use it when:

  • We need to exclude or include specific properties based on certain conditions.
  • We want to customize the JSON output for different use cases or clients.
  • We need to filter sensitive or confidential information before serialization.

Read More