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

概述

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值