jQuery调用JSON时,net.sf.json.JSONException: There is a cycle in the hierarchy!
遇到了一些问题,如hibernate延迟加载错误,这都是老掉牙的问题了,一看就知道加个lazy=flase就OK了。想不到快要完成了又遇到了新的问题,JSON死循环,实在让人郁闷。异常如下:
net.sf.json.JSONException: There is a cycle in the hierarchy!
at net.sf.json.util.CycleDetectionStrategy$StrictCycleDetectionStrategy.
handleRepeatedReferenceAsObject(CycleDetectionStrategy.java:97)
at net.sf.json.JSONObject._fromBean(JSONObject.java:674)
at net.sf.json.JSONObject.fromObject(JSONObject.java:181)
at net.sf.json.JSONArray._processValue(JSONArray.java:2381)
at net.sf.json.JSONArray.processValue(JSONArray.java:2412)
Truncated. see log file for complete stacktrace
>
仔细查了一下发现是hibernate主外键关联的错,后来就想下json源代码下来看,发现大费周章都没搞到json源码,还是老办法反编译瞅瞅,发现JSONArray根据判断取得的不同类型调用相应的方法,
if (object instanceof Collection)
return _fromCollection((Collection)object, jsonConfig);
而我从hibernate那得到的是list,所以去调用了_fromCollection方法,而里面的方法发现一个问题:该方法会不断的拆开实体属性,直到没有为止,而我的ContactGroup里有两个属性用于自身关联
private Set contactGroups = new HashSet(0);
private Set contactGroupPersons = new HashSet(0);
也就是说主外键自身关联的是个死循环,那怎么才能不让他出现这种情况呢,应该有个配置的参数后者终止循环的地方吧,查看发
现,jsonConfig,呵呵,config应该是配置参数吧,参看JsonConfig看见巨多的属性,有点晕PropertyFilter
,不提了,看了老半天,发现了一个属性PropertyFilter,PropertyFilter 是一个interface,代码如下:
public interface PropertyFilter
{
public abstract boolean apply(Object obj, String s, Object obj1);
}
也就是说我可以通过这个方法过滤掉List里的相应属性,只要让它返回true就可过滤掉,……,有点悬……我们重写一下这个方法:
JsonConfig cfg = new JsonConfig();
cfg.setJsonPropertyFilter(new PropertyFilter()
{
public boolean apply(Object source, String name, Object value) {
if(name.equals("contactGroups")||name.equals("contactGroupPersons")) {
return true;
} else {
return false;
}
}
});
将hibernate产生的实体bean中的contactGroups和contactGroupPersons过滤掉就OK了!
然后调用JSONArray.fromObject(mychildren,cfg); mychildren是hibernate返回的list。
1List<ShoppingCart> listCarts = sCartServiceImpl
2 .ShoppingCartTable(shoppingCart);
3 // 先过滤对set集合的拆解
4 JsonConfig config = new JsonConfig();
5 config.setJsonPropertyFilter(new PropertyFilter() {
6 @Override
7 public boolean apply(Object arg0, String arg1, Object arg2) {
8 if (arg1.equals("shoppingCarts")) {
9 return true;
10 } else {
11 return false;
12 }
13 }
14 });
15 // 将数据转换成Json数据
16 JSONArray jsonObject = JSONArray.fromObject(listCarts, config);
17 System.out.println(jsonObject.toString());
18
分享到:
相关推荐
如果需要解析的数据间存在级联关系,而互相嵌套引用,在hibernate中极容易嵌套而抛出net.sf.json.JSONException: There is a cycle in the hierarchy异常。
该异常为运行时异常,一定不是语法错误。 意思是JSONEObject转换异常,通常为fromObject() 方法位置报错。 检查你代码的 JSONEObject.fromObject(result) 代码位置,参数result不符合Json的定义格式,所以无法转换成...
并且对Dao和Service进行了封装,内含.jar包,并且解决了一对多双向关联的could not initialize proxy - no Session错误,同时解决了……invoked on net.sf.json.JSONException: There is a cycle in the hierarchy!...
用Java编程语言进行编码和解码JSON对象所需要的jar包。。
从服务端收到的json中有中文 然后JsonData jd = JsonMapper.ToObject(strJson); json中如有中文 会出现\uXXXX\uXXXX等 我改了下 上传了能解决此问题的litjson版本
org.json.JSONObject的6个jar包 commons-beanutils;commons-collections;commons-lang;commons-logging;ezmorph;json-lib
litjson-develop0.36.0 C#使用LitJson解析Json数据 接受MQ服务器返回的值
JSON与JAVA数据的相互转换 import net.sf.json.JSONArray; import net.sf.json.JSONException; import net.sf.json.JSONObject; import net.sf.json.JSONSerializer; 非常方便的工具类!
JSON NET For Unity 2.0.1
解决JsonException: Max allowed object depth reached while trying to export from type UnityEngine.Vector3
org.json全部源代码 1、CDL.java ...7、JSONException.java 8、JSONML.java 9、JSONObject.java 10、JSONString.java 11、JSONTokener.java 12、JSONWriter.java 13、XML.java 14、XMLTokener.java
此文档包含类库和文档。 类文件如下: JSON:解析json字符串 JSONObject:json对象 JSONArray:json数组 JSONException:json异常 详见javadoc
try (JSONInputStream in = new JSONInputStream(json)) {obj = in.readObject();} catch (IOException | JSONException e) {e.printStackTrace();}第三是使用输入流,例如文件: JSONObject obj;try (JSONInputStr
JsonUtil
解析json的工具类,包括JSONObject、JSONArray、JSONException、JSONString等
本文实例为大家分享了...import org.json.JSONException; import org.json.JSONObject; /** * * 科室 * Created by LICHENGLONG on 2017-10-02. */ public class BasSection { public Integer id;//科室id pub
目录解析器 解析目录并生成其结构树。 用其他语言阅读:英语| 1.什么是目录解析器 1.1简介 Dir解析器是基于Node.js的功能强大的文件夹分析工具,可以在命令行或JavaScript代码中使用。 可以设置许多实用参数,以...
import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class JsonDemo extends Activity { /* * 解析JSON的...
在异常中包装JSON编码/解码错误 围绕json_encode()和json_decode()的简单包装,用于捕获任何错误而无需执行json_last_error() 。 在PHP 7.3中,这些函数将。 use Eastwest \ Json \ Json ; use Eastwest \ Json \ ...
此资源包包含了《Java的JSON解析》的源代码,包括四个类: 1、JSON #解析json字符串,并生成JSONObject 2、JSONObject #json对象 3、JSONArray #json数组对象 4、JSONException #JSON解析过程中抛出的异常