Json-lib的处理机制(3)--Filter接口

来源:互联网 发布:关于养鱼的软件 编辑:程序博客网 时间:2024/05/02 04:16

概述

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;   }}
0 0
原创粉丝点击