在中Hibernate开发中,用FastJson转JSON,由于类定义的对象,所以查询到的子对象有相同的,这时FastJSON,在
转JSON时,会把已经有的JSON对象,用引用$,ref表示,网上查到说把FastJSON禁止引用,SerializerFeature.DisableCircularReferenceDetect
当开启这个属性时JAVA,会出现Stack溢出的报错。
没有一个靠谱的,可以重写FastJSON中的PropertyPreFilter类,然后指明要转JSON的字段,就不会出现Stack溢出的报错,废话不多说。
以下为重写工具类
public class ComplexPropertyPreFilter implements PropertyPreFilter {
/**
* @Fields includes : TODO(包含的属性)
*/
private Map<Class<?>, String[]> includes = new HashMap<Class<?>, String[]>();
/**
* @Fields excludes : TODO(不包含的属性)
*/
private Map<Class<?>, String[]> excludes = new HashMap<Class<?>, String[]>();
static {
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect
.getMask();
}
public ComplexPropertyPreFilter() {
}
public ComplexPropertyPreFilter(Map<Class<?>, String[]> includes) {
super();
this.includes = includes;
}
public boolean apply(JSONSerializer serializer, Object source, String name) {
// 对象为空。直接放行
if (source == null) {
return true;
}
// 获取当前需要序列化的对象的类对象
Class<?> clazz = source.getClass();
// 无需序列的对象、寻找需要过滤的对象,可以提高查找层级
// 找到不需要的序列化的类型
for (Map.Entry<Class<?>, String[]> item : this.excludes.entrySet()) {
// isAssignableFrom(),用来判断类型间是否有继承关系
if (item.getKey().isAssignableFrom(clazz)) {
String[] strs = item.getValue();
// 该类型下 此 name 值无需序列化
if (isHave(strs, name)) {
return false;
}
}
}
// 需要序列的对象集合为空 表示 全部需要序列化
if (this.includes.isEmpty()) {
return true;
}
// 需要序列的对象
// 找到不需要的序列化的类型
for (Map.Entry<Class<?>, String[]> item : this.includes.entrySet()) {
// isAssignableFrom(),用来判断类型间是否有继承关系
if (item.getKey().isAssignableFrom(clazz)) {
String[] strs = item.getValue();
// 该类型下 此 name 值无需序列化
if (isHave(strs, name)) {
return true;
}
}
}
return false;
}
/*
* 此方法有两个参数,第一个是要查找的字符串数组,第二个是要查找的字符或字符串
*/
public static boolean isHave(String[] strs, String s) {
for (int i = 0; i < strs.length; i++) {
// 循环查找字符串数组中的每个字符串中是否包含所有查找的内容
if (strs[i].equals(s)) {
// 查找到了就返回真,不在继续查询
return true;
}
}
// 没找到返回false
return false;
}
public Map<Class<?>, String[]> getIncludes() {
return includes;
}
public void setIncludes(Map<Class<?>, String[]> includes) {
this.includes = includes;
}
public Map<Class<?>, String[]> getExcludes() {
return excludes;
}
public void setExcludes(Map<Class<?>, String[]> excludes) {
this.excludes = excludes;
}
}
以下为具体工具类的调用方式
complexPropertyPreFilter complexPropertyPreFilter = new ComplexPropertyPreFilter();
complexPropertyPreFilter
.setIncludes(new HashMap<Class<?>, String[]>() {
private static final long serialVersionUID = -8411128674046835592L;
{
put(Tree.class, new String[] { "id", "text", "pid",//要显示的属性字段
"checked", "paramType", "paramObject" });
put(String.class, new String[] { "loaderName" });
}
});
super.getResponse()
.getWriter()
.print(JSON.toJSONString(this.getTree(departmentList),
complexPropertyPreFilter,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullListAsEmpty));
本文转自 CSDN 用户 Nothing http://write.blog.csdn.net/postedit/50963462