概述
Json-lib中的Filter都实现了这个接口net.sf.json.util.PropertyFilter
这个接口只有一个核心的方法:
public interface PropertyFilter {
/**
* @param source the owner of the property
* @param name the name of the property
* @param value the value of the property
* @return true if the property will be filtered out, false otherwise
*/
boolean apply( Object source, String name, Object value );
}
如果返回ture,则这个属性被忽略,否则就会显示这个属性。这个功能就是当Java对象属性过多,需要过滤一些属性的时候,可以扩展这个Filter进行处理!
一个Filter的列子
public class MyPropertyFilter implements PropertyFilter {
/**
* 过滤掉birthday属性
*/
@Override
public boolean apply(Object arg0, String arg1, Object arg2) {
if(arg1.equals("birthday"))
{
return true;
}
else
{
return false;
}
}
public static void main(String[] args) {
// 万能的MyObject
MyObject obj = new MyObject();
obj.name = "name11";
obj.num = 100L;
System.out.println(JSONObject.fromObject(obj));
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter(new MyPropertyFilter());
JSONObject fromObject = JSONObject.fromObject(obj, config);
System.out.println(fromObject.toString());
}
}
控制台输出
{"birthday":null,"firstDay":null,"name":"name11","num":100,"son":null}
{"firstDay":null,"name":"name11","num":100,"son":null}
“brithday”没有显示,这个功能很好理解。可以根据我们实际情况进行适当的扩展!
默认实现
当然这个Filter也有很多默认的实现!都在filters这个目录下:
类名 | 描述 |
---|---|
AndPropertyFilter | 两个Filter都要忽略这个属性的时候才会忽略 |
CompositePropertyFilter | 多个Filter,有一个忽略,就忽略 |
FalsePropertyFilter | 是默认的Filter,全都不会略 |
MappingPropertyFilter | 存储多个Filter,可以自己实现关注的Filter处理逻辑 |
NotPropertyFilter | 与另一个Filter互为相反的效果 |
OrPropertyFilter | 两个Filter,满足一个条件就忽略 |
TruePropertyFilter | 被这个Filter匹配的属性,直接忽略 |
AndPropertyFilter.java
/**
* @author Andres Almiray <aalmiray@users.sourceforge.net>
*/
public class AndPropertyFilter implements PropertyFilter {
private PropertyFilter filter1;
private PropertyFilter filter2;
public AndPropertyFilter( PropertyFilter filter1, PropertyFilter filter2 ) {
this.filter1 = filter1;
this.filter2 = filter2;
}
public boolean apply( Object source, String name, Object value ) {
if( filter1 != null && filter1.apply( source, name, value ) && filter2 != null
&& filter2.apply( source, name, value ) ){
return true;
}
return false;
}
}
CompositePropertyFilter.java
/**
* @author Andres Almiray <aalmiray@users.sourceforge.net>
*/
public class CompositePropertyFilter implements PropertyFilter {
private List filters = new ArrayList();
public CompositePropertyFilter() {
this( null );
}
public CompositePropertyFilter( List filters ) {
if( filters != null ){
for( Iterator i = filters.iterator(); i.hasNext(); ){
Object filter = i.next();
if( filter instanceof PropertyFilter ){
this.filters.add( filter );
}
}
}
}
public void addPropertyFilter( PropertyFilter filter ) {
if( filter != null ){
filters.add( filter );
}
}
public boolean apply( Object source, String name, Object value ) {
for( Iterator i = filters.iterator(); i.hasNext(); ){
PropertyFilter filter = (PropertyFilter) i.next();
if( filter.apply( source, name, value ) ){
return true;
}
}
return false;
}
public void removePropertyFilter( PropertyFilter filter ) {
if( filter != null ){
filters.remove( filter );
}
}
}
FalsePropertyFilter.java
/**
* @author Andres Almiray <aalmiray@users.sourceforge.net>
*/
public class FalsePropertyFilter implements PropertyFilter {
public boolean apply( Object source, String name, Object value ) {
return false;
}
}
MappingPropertyFilter.java
抽象类
/**
* @author Andres Almiray <aalmiray@users.sourceforge.net>
*/
public abstract class MappingPropertyFilter implements PropertyFilter {
private Map filters = new HashMap();
public MappingPropertyFilter() {
this( null );
}
public MappingPropertyFilter( Map filters ) {
if( filters != null ){
for( Iterator i = filters.entrySet()
.iterator(); i.hasNext(); ){
Map.Entry entry = (Map.Entry) i.next();
Object key = entry.getKey();
Object filter = entry.getValue();
if( filter instanceof PropertyFilter ){
this.filters.put( key, filter );
}
}
}
}
public void addPropertyFilter( Object target, PropertyFilter filter ) {
if( filter != null ){
filters.put( target, filter );
}
}
public boolean apply( Object source, String name, Object value ) {
for( Iterator i = filters.entrySet()
.iterator(); i.hasNext(); ){
Map.Entry entry = (Map.Entry) i.next();
Object key = entry.getKey();
if( keyMatches( key, source, name, value ) ){
PropertyFilter filter = (PropertyFilter) entry.getValue();
return filter.apply( source, name, value );
}
}
return false;
}
public void removePropertyFilter( Object target ) {
if( target != null ){
filters.remove( target );
}
}
protected abstract boolean keyMatches( Object key, Object source, String name, Object value );
}
NotPropertyFilter.java
/**
* @author Andres Almiray <aalmiray@users.sourceforge.net>
*/
public class NotPropertyFilter implements PropertyFilter {
private PropertyFilter filter;
public NotPropertyFilter( PropertyFilter filter ) {
this.filter = filter;
}
public boolean apply( Object source, String name, Object value ) {
if( filter != null ){
return !filter.apply( source, name, value );
}
return false;
}
}
OrPropertyFilter.java
/**
* @author Andres Almiray <aalmiray@users.sourceforge.net>
*/
public class OrPropertyFilter implements PropertyFilter {
private PropertyFilter filter1;
private PropertyFilter filter2;
public OrPropertyFilter( PropertyFilter filter1, PropertyFilter filter2 ) {
this.filter1 = filter1;
this.filter2 = filter2;
}
public boolean apply( Object source, String name, Object value ) {
if( (filter1 != null && filter1.apply( source, name, value ))
|| (filter2 != null && filter2.apply( source, name, value )) ){
return true;
}
return false;
}
}
TruePropertyFilter.java
/**
* @author Andres Almiray <aalmiray@users.sourceforge.net>
*/
public class TruePropertyFilter implements PropertyFilter {
public boolean apply( Object source, String name, Object value ) {
return true;
}
}