@JsonFilter
可以按照属性名过滤要序列化的属性,它指定一个过滤器的 ID,真正的过滤器通过 ObjectMapper
注册,过滤器需要实现接口 com.fasterxml.jackson.databind.ser.PropertyFilter
。通常直接使用 SimpleFilterProvider
、SimpleBeanPropertyFilter
。
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("empFilter", SimpleBeanPropertyFilter.filterOutAllExcept("name", "phone"));
ObjectMapper om = new ObjectMapper();
om.setFilterProvider(filterProvider);
...
SimpleBeanPropertyFilter 的实用方法:
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) {
....
}
..........
}
Examples
用于类级别
@JsonFilter("empFilter")
public class Employee {
private String name;
private String dept;
private int salary;
private String phone;
...
}
public class ExampleMain {
public static void main(String[] args) throws JsonProcessingException {
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"}
用于字段
public class Person {
private String name;
@JsonFilter("PersonAddressFilter")
private Address address;
...
}
public class Address {
private String street;
private String city;
private int zipCode;
...
}
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}}
原文链接
Jackson JSON - Filtering out specified properties using @JsonFilter Annotation