通过注解实现JSONPropertyFilter - 全栈笔记

通过注解实现JSONPropertyFilter

任亦伟 JAVA, 项目日记 2015-05-04 521 次浏览 没有评论

 之前发表的文章涉及到JSONObject JSONArray属性过滤时,都是通过判断来实现的,那如果我们要在多处进行过滤的话,就会重复写很多代码,而且也不好修改。所以,这里我设计了一个注解annotation类,通过标注注解来实现JSONObject 和JSOnArray的属性过滤。

1、编写注解类

01
02
package com.renyiwei.wydns.json.annotation;
03
 
04
import java.lang.annotation.ElementType;
05
import java.lang.annotation.Retention;
06
import java.lang.annotation.RetentionPolicy;
07
import java.lang.annotation.Target;
08
 
09
/**
10
 * 
11
 * @author RenYiwei
12
 *
13
 */
14
@Retention(RetentionPolicy.RUNTIME)
15
// 可以注解在字段,方法,类上
16
@Target({ ElementType.FIELD, ElementType.METHOD,ElementType.TYPE })
17
public @interface JSONPropertyFilter {
18
 
19
  //默认注解了就是过滤
20
  boolean Value() default true;
21
}
22
 
23

2、编写AnnotationPropertyFilter实现PropertyFilter

01
02
package com.renyiwei.wydns.json;
03
 
04
import java.beans.IntrospectionException;
05
import java.beans.PropertyDescriptor;
06
import java.lang.reflect.Field;
07
import java.lang.reflect.Method;
08
 
09
import net.sf.json.util.PropertyFilter;
10
 
11
import com.renyiwei.wydns.json.annotation.JSONPropertyFilter;
12
 
13
/**
14
 * 
15
 * @author RenYiwei
16
 *
17
 */
18
public class AnnotationPropertyFilter implements PropertyFilter {
19
 
20
  public boolean apply(Object object, String name, Object value) {
21
 
22
    // 通过读取注解来决定是否序列化
23
    try {
24
      // 获取类上的注解
25
      JSONPropertyFilter clazzAnnotation = object.getClass().getAnnotation(JSONPropertyFilter.class);
26
      // 如果类上有注解,并且值为true,表示需要过滤
27
      if (clazzAnnotation != null && clazzAnnotation.Value()) {
28
        // 不要这个字段 返回true
29
        return true;
30
      }
31
      // 获取字段上的注解
32
      Field field = object.getClass().getDeclaredField(name);
33
      JSONPropertyFilter fieldAnnotation = field.getAnnotation(JSONPropertyFilter.class);
34
      // 如果字段上注解了,并且值为true,表示需要过滤
35
      if (null != fieldAnnotation && fieldAnnotation.Value()) {
36
        // 不要这个字段 返回true
37
        return true;
38
      }
39
 
40
      // 通过属性描述器 获取属性get方法的注解
41
 
42
      PropertyDescriptor pd = new PropertyDescriptor(field.getName(), object.getClass());
43
      Method getMethod = pd.getReadMethod();
44
      if (null != getMethod) {
45
        JSONPropertyFilter methodAnnotation = getMethod.getAnnotation(JSONPropertyFilter.class);
46
        // 如果get方法上注解了,并且值为true,表示需要过滤
47
        if (null != fieldAnnotation && fieldAnnotation.Value()) {
48
          // 不要这个字段 返回true
49
          return true;
50
        }
51
      }
52
    } catch (NoSuchFieldException e) {
53
      return false;
54
    } catch (SecurityException e) {
55
      return false;
56
    } catch (IntrospectionException e) {
57
      return false;
58
    }
59
 
60
    return false;
61
  }
62
 
63
}
64

3、在javaBean上面标注注解

01
02
package com.renyiwei.wydns.domain;
03
 
04
import java.sql.Timestamp;
05
import java.util.HashSet;
06
import java.util.Map;
07
import java.util.Set;
08
 
09
import javax.xml.bind.annotation.XmlTransient;
10
 
11
import com.renyiwei.wydns.json.annotation.JSONPropertyFilter;
12
 
13
 
14
public class Product {
15
 
16
  private Long id;
17
  //在产品系统的产品编号
18
  private Long productid;
19
  //在订单系统的产品编号
20
  private Long orderpid;
21
  private Long orderid;
22
  private String name;
23
  private String type;
24
  private String extension;
25
  //在这里标注
26
  @JSONPropertyFilter
27
  private Server server;
28
  // 创建时间
29
  private String createtime;
30
  // 到期时间
31
  private String expdate;
32
  //购买时长
33
  private String period;
34
  //在这里标注
35
  @JSONPropertyFilter
36
  private Client client;
37
  private Timestamp ordertime;
38
  //省略get set方法
39
}
40

4、调用的时候传入AnnotationPropertyFilter对象

01
02
public String listAjax(){
03
  List<Product> productList = productService.getAll();
04
  Map<String, Object> returnMap = new HashMap<String, Object>();
05
  JsonConfig config = new JsonConfig();
06
  //在这里传入AnnotationPropertyFilter对象
07
  config.setJsonPropertyFilter(new AnnotationPropertyFilter());
08
  returnMap.put("results", productList);
09
  returnObj = JSONObject.fromObject(returnMap,config);
10
  return SUCCESS;
11
}
12

发表评论

回顶部