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