Close

Jackson JSON - Filtering out specified properties using @JsonFilter Annotation

[Last Updated: Aug 11, 2020]

@JsonFilter annotation can be used to filter certain properties of a POJO during serialization.

This annotation specifies only the filter name. For example

@JsonFilter("myFilterId")
public class Person{
 private String name;
 private int age;
 private String address;
 .....
}

Then we can specify the properties name of the object at the time of serialization using FilterProvider (implementation SimpleFilterProvider) and SimpleBeanPropertyFilter:

 SimpleFilterProvider filterProvider = new SimpleFilterProvider();
 //only 'name' and 'age' will be serialized
 filterProvider.addFilter("empFilter", SimpleBeanPropertyFilter.filterOutAllExcept("name", "age"));
 ObjectMapper om = new ObjectMapper();
 om.setFilterProvider(filterProvider);
...
 //now serialize some Person instances

SimpleBeanPropertyFilter useful methods:

package com.fasterxml.jackson.databind.ser.impl;
 ....
public class SimpleBeanPropertyFilter implements BeanPropertyFilter, PropertyFilter{
   
    //serializes all properties
    public static SimpleBeanPropertyFilter serializeAll() {
         ....
    }

    //filters out all properties except the ones specified in the set
    public static SimpleBeanPropertyFilter filterOutAllExcept(Set<String> properties) {
         ....
    }

    public static SimpleBeanPropertyFilter filterOutAllExcept(String... propertyArray) {
          ....
    }

    public static SimpleBeanPropertyFilter serializeAllExcept(Set<String> properties) {
          ....
    }

    public static SimpleBeanPropertyFilter serializeAllExcept(String... propertyArray) {
          ....
    }

  ..........  
}

@JsonFilter can also be used on property level. Let's see some examples.

Examples

Using @JsonFilter on class

package com.logicbig.example;

import com.fasterxml.jackson.annotation.JsonFilter;

@JsonFilter("empFilter")
public class Employee {
    private String name;
    private String dept;
    private int salary;
    private String phone;
    .............
}

Serializing

public class ExampleMain {
    public static void main(String[] args) throws IOException {

        //specifying fields to be filtered
        SimpleFilterProvider filterProvider = new SimpleFilterProvider();
        filterProvider.addFilter("empFilter",
                SimpleBeanPropertyFilter.filterOutAllExcept("name", "phone"));

        ObjectMapper om = new ObjectMapper();
        om.setFilterProvider(filterProvider);

        Employee e = Employee.of("Jake", "Admin",3000, "111-111-111");
        System.out.println(e);
        System.out.println("-- serializing --");
        String s = om.writeValueAsString(e);
        System.out.println(s);
    }
}
Employee{name='Jake', dept='Admin', salary=3000, phone='111-111-111'}
-- serializing --
{"name":"Jake","phone":"111-111-111"}

Using @JsonFilter on properties

package com.logicbig.example;

import com.fasterxml.jackson.annotation.JsonFilter;

public class Person {
    private String name;
    @JsonFilter("PersonAddressFilter")
    private Address address;
    .............
}
package com.logicbig.example;

public class Address {
    private String street;
    private String city;
    private int zipCode;
    .............
}

Serializing

public class ExampleMain2 {
    public static void main(String[] args) throws IOException {
        //specifying fields to be filtered
        SimpleFilterProvider filterProvider = new SimpleFilterProvider();
        filterProvider.addFilter("PersonAddressFilter",
                SimpleBeanPropertyFilter.filterOutAllExcept("zipCode"));

        ObjectMapper om = new ObjectMapper();
        om.setFilterProvider(filterProvider);

        Person p = Person.of("Jack",
                Address.of("101 Green Pile Dr", "Smoke Valley", 12323));
        System.out.println(p);
        System.out.println("-- serializing --");
        String s = om.writeValueAsString(p);
        System.out.println(s);
    }
}
Person{name='Jack', address=Address{street='101 Green Pile Dr', city='Smoke Valley', zipCode=12323}}
-- serializing --
{"name":"Jack","address":{"zipCode":12323}}

Example Project

Dependencies and Technologies Used:

  • jackson-databind 2.9.7: General data-binding functionality for Jackson: works on core streaming API.
  • JDK 11
  • Maven 3.5.4

Jackson -@JsonFilter Example Select All Download
  • jackson-json-filter-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • Employee.java

    See Also