java过滤器重写_重写 FastJson 属性过滤器

packagecom.example.util.fastjson;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.serializer.JSONSerializer;importcom.alibaba.fastjson.serializer.PropertyPreFilter;importcom.alibaba.fastjson.serializer.SerializerFeature;importcom.suncompass.example.auth.entity.AuthEmployee;importcom.suncompass.example.auth.entity.AuthMenu;importcom.suncompass.framework.base.entity.BaseEntity;/***@author:晨风²º¹³ 

* @Comment : fastjson 针对类型的属性选择过滤器(可以跨层级) 
*/publicclassComplexPropertyPreFilterimplementsPropertyPreFilter {privateMap, String[]>includes=newHashMap<>();privateMap, String[]>excludes=newHashMap<>();static{

JSON.DEFAULT_GENERATE_FEATURE|=SerializerFeature.DisableCircularReferenceDetect.getMask();

}publicComplexPropertyPreFilter() {

}publicComplexPropertyPreFilter(Map, String[]>includes) {super();this.includes=includes;

}publicbooleanapply(JSONSerializer serializer, Object source, String name) {//对象为空。直接放行if(source==null) {returntrue;

}//获取当前需要序列化的对象的类对象Class>clazz=source.getClass();//无需序列的对象、寻找需要过滤的对象,可以提高查找层级//找到不需要的序列化的类型for(Map.Entry, String[]>item :this.excludes.entrySet()) {//isAssignableFrom(),用来判断类型间是否有继承关系if(item.getKey().isAssignableFrom(clazz)) {

String[] strs=item.getValue();//该类型下 此 name 值无需序列化if(isHave(strs, name)) {returnfalse;

}

}

}//需要序列的对象集合为空 表示 全部需要序列化if(this.includes.isEmpty()) {returntrue;

}//需要序列的对象//找到不需要的序列化的类型for(Map.Entry, String[]>item :this.includes.entrySet()) {//isAssignableFrom(),用来判断类型间是否有继承关系if(item.getKey().isAssignableFrom(clazz)) {

String[] strs=item.getValue();//该类型下 此 name 值无需序列化if(isHave(strs, name)) {returntrue;

}

}

}returnfalse;

}/** 此方法有两个参数,第一个是要查找的字符串数组,第二个是要查找的字符或字符串*/publicstaticbooleanisHave(String[] strs, String s) {for(inti=0; i

}

}//没找到返回falsereturnfalse;

}publicMap, String[]>getIncludes() {returnincludes;

}publicvoidsetIncludes(Map, String[]>includes) {this.includes=includes;

}publicMap, String[]>getExcludes() {returnexcludes;

}publicvoidsetExcludes(Map, String[]>excludes) {this.excludes=excludes;

}publicstaticvoidmain(String[] args) {//use instanceOf,用来判断对象是否是类的实例//use isAssignableFrom(),用来判断类型间是否有继承关系//use isInstance(),用来判断对象是否是类的实例Class>intClass=Integer.class;//Create various objects.String str="Hello";

Date date=newDate();

Integer i=newInteger(10);//Is str an instance of class Integer?booleancheck1=intClass.isInstance(str);

System.out.println("str is an Integer?"+check1);//Is date an instance of class Integer?booleancheck2=intClass.isInstance(date);

System.out.println("date is an Integer?"+check2);//Is i an instance of class Integer?booleancheck3=intClass.isInstance(i);

System.out.println("i is an Integer?"+check3);

System.out.println(BaseEntity.class.isInstance(newAuthEmployee()));

System.out.println(AuthEmployee.class.isInstance(newAuthMenu()));

System.out.println(BaseEntity.class.isAssignableFrom(AuthEmployee.class));

}

}

测试代码:

packagecom.example.auth.test.fastjson;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importcom.alibaba.fastjson.JSON;importcom.example.util.fastjson.ComplexPropertyPreFilter;publicclassA {privateInteger aid;privateB b;privateListc=newArrayList<>();publicA() {super();

}publicstaticvoidmain(String[] args) {

A a=newA();

a.setAid(1);

B b=newB();

b.setBid(2);

a.setB(b);

b.setA(a);

C c=newC();

c.setId(3);

a.getC().add(c);

b.getC().add(c);

c.setA(a);

c.setB(b);

ComplexPropertyPreFilter filter=newComplexPropertyPreFilter();

filter.setExcludes(newHashMap, String[]>() {privatestaticfinallongserialVersionUID=-8411128674046835592L;

{

put(A.class,newString[] {"aid"});

put(B.class,newString[] {"bid","a"});

put(C.class,newString[] {"a","b"});

}

});

System.out.println(JSON.toJSONString(a, filter));

}publicInteger getAid() {returnaid;

}publicvoidsetAid(Integer aid) {this.aid=aid;

}publicB getB() {returnb;

}publicvoidsetB(B b) {this.b=b;

}publicListgetC() {returnc;

}publicvoidsetC(Listc) {this.c=c;

}

}

packagecom.example.auth.test.fastjson;importjava.util.ArrayList;importjava.util.List;publicclassB {privateInteger bid;privateA a;privateListc=newArrayList<>();publicB() {super();

}publicInteger getBid() {returnbid;

}publicvoidsetBid(Integer bid) {this.bid=bid;

}publicA getA() {returna;

}publicvoidsetA(A a) {this.a=a;

}publicListgetC() {returnc;

}publicvoidsetC(Listc) {this.c=c;

}

}

packagecom.example.auth.test.fastjson;publicclassC {privateInteger id;privateA a;privateB b;publicC() {super();

}publicA getA() {returna;

}publicvoidsetA(A a) {this.a=a;

}publicB getB() {returnb;

}publicvoidsetB(B b) {this.b=b;

}publicInteger getId() {returnid;

}publicvoidsetId(Integer id) {this.id=id;

}

}

ok,代码已贴好,测试方法在A类。From :

http://aijava.duapp.com/archives/override-fastjson-propertyprefilter.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值