对象引用循环导致的 net.sf.json.JSONException: There is a cycle in the hierarchy
本文由发表于5年前 | J2EE | 暂无评论 |  被围观 6,582 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 指弹吉他 && 技术 more
分享到:
 
2013 5/30
如果您有更好的原创技术博文或者观点,欢迎投稿:admin@itzhai.com,或者关注订阅左侧浮动面板的微信号订阅IT宅itread)发送消息。
文章评论
    没有评论
给我留言

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 CMM软件能力成熟度模型的5个等级及其特点 2011/5/19
2 关于学习新技术的方法和让自己不断进步的一点建议 2011/5/27
3 Struts2的一个和多个文件上传的实现 2011/5/8
4 Java基础笔记 – 线程间通信的实现 wait()和notify()方法 2011/10/25
5 Android开发在Eclipse环境中无法显示提示信息This element neither has attached source nor attached Javadoc 2011/7/15
6 jQuery中使用$.post提交Ajax请求及传参问题 2011/6/2
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

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

联系我们:admin@itzhai.com

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