对象引用循环导致的 net.sf.json.JSONException: There is a cycle in the hierarchy
本文由发表于5年前 | J2EE | 暂无评论 |  被围观 10,830 views+
当然,还有如下的方法可以实现属性的排除:实现JSONString接口:(排除了desc)设置JsonConfig的propertyFilter过滤属性:写一个自定义的JsonBeanProcessor方法:

当使用json-lib在Java中把对象转换为JSON字符串时易产生的错误,主要的原因是出现了如下的情形:

model a里面包含了b,而model b里面又包含了a,这样造成了解析成对象的过程中的死循环,于是就报错了:

net.sf.json.JSONException: There is a cycle in the hierarchy!
    at net.sf.json.util.CycleDetectionStrategy$StrictCycleDetectionStrategy.handleRepeatedReferenceAsObject(CycleDetectionStrategy.java:97)

如果还是需要保留这种关系,可以使用json-lib提供的JsonConfig把循环的属性在转换的过程中忽略掉:

JsonConfig config = new JsonConfig();
config.setExcludes(new String[]{"department"});
String json = JSONArray.fromObject(userList, config).toString();
当然,还有如下的方法可以实现属性的排除:
实现JSONString接口:(排除了desc)
public class User implements JSONString {  
   private String name;  
   private String password;  
   private String desc;  

   // getters & setters  

   public String toJSONString() {  
      return "{name:'"+name+"', password:'"+password+"'}";  
   }  
}
设置JsonConfig的propertyFilter过滤属性:
public class User {  
   private String name;  
   private String password;  
   private String desc;  
   // ...  
}  

JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.setJsonPropertyFilter( new PropertyFilter(){  
   public boolean apply( Object source, String name, Object value ){  
      return source instanceof User && name.equals("desc");  
   }  
});  
User user = new User();  
JSON json = JSONSerializer.toJSON( user, jsonConfig )
写一个自定义的JsonBeanProcessor方法:
public class User {  
   private String name;  
   private String password;  
   private String desc;  
   // ...  
}  

JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.registerJsonBeanProcessor( User.class,  
   new JsonBeanProcessor(){  
      public JSONObject processBean( Object bean, JsonConfig jsonConfig ){  
         if( !(bean instanceof User) ){  
            return new JSONObject(true);  
         }  
         User user = (user) bean;  
         return new JSONObject()  
            .element( "name", user.getName() )  
            .element( "password", user.getPassword() );  
      }  
});  
User user = new User();  
JSON json = JSONSerializer.toJSON( user, jsonConfig );
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/object-reference-cycles-resulting-net-sf-json-jsonexception-there-is-a-cycle-in-the-hierarchy.html
关键字: , ,
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2013 5/30
如果您有更好的原创技术博文或者观点,欢迎投稿:admin@itzhai.com,或者关注订阅左侧浮动面板的微信号订阅IT宅itread)发送消息。
文章评论
    没有评论
给我留言

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 EXT的核心组件,相关的处理事件和类的使用 2011/7/24
2 8251A查询法收发数据的通信程序 2011/4/27
3 C++语法笔记 – 异常处理 2011/9/4
4 Javascript Web Application笔记之MVC和类 – 类的创建 类库的封装与JSON方式添加函数 2012/6/18
5 Struts2笔记 – Struts2相关帮助文档和在线学习资料 2011/6/18
6 Java源码分析 – Thread线程类源码分析 2011/10/23
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.