FastJson转JSON 引用问题

在中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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值