struts2.1.8 中json格式转换问题:需要的7个包全部导入——只是commons-lang-2.4.jar 我用的是commons-lang-2.3.jar。这个应该没问题吧!
我的配置跟页面都没有问题~~~!因为下面的测试可以正常提交跟响应!
但是在执行这一句的时候(this.getMgrMeetingList()返回的是list集合):
JSONObject json = JSONObject.fromObject(this.getMgrMeetingList());
有错:net.sf.json.JSONException: There is a cycle in the hierarchy!
网上查了一下:说是Hibernate关联属性的问题、也修改了一些代码、但是就是不行!
我的action代码://获取会议室编号
String meet = request.getParameter("meetId");
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter(new PropertyFilter(){
public boolean apply(Object source, String name, Object value) {
if(name.equals("tbmeetroom") || "tbmeetroom" == name
|| name.equals("tbmeettype") || "tbmeettype" == name
||name.equals("tbmeetfiles") || "tbmeetfiles" == name
|| name.equals("tbmeetpersons") || "tbmeetpersons" == name ) {

return true;

} else {

return false;

}
}
});
//如果会议编号不为空
if(null !=meet && !"".equals(meet)){
//创建获取星期日期对象
TimeTake time = new TimeTake();
//调用查询方法
this.setMgrMeetingList(mgrService.getMgrByTime(Long.valueOf(meet), time.getTime()));  
}
//创建json对象
JSONObject json = JSONObject.fromObject(this.getMgrMeetingList(),config);
result = json.toString();
System.out.println(result);
return SUCCESS;
我的属性文件:<many-to-one name="tbmeetroom" class="com.boxun.crm.dao.entities.Tbmeetroom" fetch="select">
            <column name="HUIYISHI" precision="22" scale="0">
                <comment>会议室,外键,和会议室管理主键ID对应</comment>
            </column>
        </many-to-one>
        <many-to-one name="tbmeettype" class="com.boxun.crm.dao.entities.Tbmeettype" fetch="select">
            <column name="LEIXING" precision="22" scale="0">
                <comment>会议类型,外键,和会议类型表的主键ID相关联</comment>
            </column>
        </many-to-one> <set name="tbmeetfiles" inverse="true">
            <key>
                <column name="MEETID" precision="22" scale="0">
                    <comment>外键,和会议管理主键ID对应</comment>
                </column>
            </key>
            <one-to-many class="com.boxun.crm.dao.entities.Tbmeetfile" />
        </set>
        <set name="tbmeetpersons" inverse="true">
            <key>
                <column name="MEETID" precision="22" scale="0">
                    <comment>外键,和会议管理主键ID对应</comment>
                </column>
            </key>
            <one-to-many class="com.boxun.crm.dao.entities.Tbmeetperson" />
        </set>就只有这些关联!调试的时候、在config里面莫名其妙的执行完毕!不知道错在什么地方、希望各位给看看!感激不尽!

解决方案 »

  1.   

    怎么没人来啊~~~呜呜呜!!!不管什么formObject了只要能从集合数据转换成json的都成!自己写的那种也可以!
      

  2.   


    在转化成json格式的时候出现的!
    这句代码:JSONObject json = JSONObject.fromObject(this.getMgrMeetingList())
      

  3.   

    无论是JSONObject还是JSONArray都一样!!!报错:net.sf.json.JSONException: There is a cycle in the hierarchy!
      

  4.   

    你的不是JSON 他当然报错。。还有,,JSON不等于数据(ArrayList)
      

  5.   

    Hibernate属性文件中的关联!!!set节点!!!
      

  6.   

    structs2的json转换并不一定是你需要的,你最好自己写你的实体类到json数据的转换,不难,用一个递归可以搞定
      

  7.   

    我去给你找了一段你看看可以不.json-lib 出现net.sf.json.JSONException: There is a cycle in the hierarchy异常的解决办法收藏学习笔记 2009-01-19 10:00:09 阅读445 评论0   字号:大中小 订阅 .因为项目中使用了AJAX技术,JAR包为:json-lib.jar, 在开发过程中遇到了一个JSON-LIB和Hibernate有关的问题:
    因为Hibernate中设置了自身关联:对象类.hbm.xml:
    <many-to-one lazy="false" cascade="none">
       <column name="group_id" />
      </many-to-one>
    起初想通过hibernate来解决问题,就是想过滤掉自身关联后来查资料发现不可能实现,最后找到通过JSON-LIB来过滤关联的集合属性,代码如下:
      

  8.   

    妈的图片不显示JsonConfig config = new JsonConfig();
       config.setJsonPropertyFilter(new PropertyFilter(){
        public boolean apply(Object source, String name, Object value) {
         if(name.equals("parentGroup") || name.equals("childGroups")) {
          return true;
         } else {
          return false;
         }
        }
        
       });
       Iouser user = (Iouser) getBaseManager().get(Iouser.class, iouserId);
       JSONObject jsonObject = JSONObject.fromObject(user, config); 当JSON-LIB解析JAVABEAN时过滤掉parentGroup、childGroups这两个属性,重新启动服务,pass
      

  9.   

    11楼的例子我看过·~~~我上面贴的代码就是这样的!!!
       不可以! 
    9楼说自己写一个转换类!!!
     我也想啊!  自己写的转换类有问题: //获取会议室编号
            String meet = request.getParameter("meetId");
            //创建json对象
            JSONObject obj = new JSONObject();
            //创建一个map集合(用来存储obj——json对象)
            Map<String, Object> map = new HashMap<String, Object>();
            //如果会议编号不为空
            if(null !=meet && !"".equals(meet)){
                //创建获取星期日期对象
                TimeTake time = new TimeTake();
                //调用查询方法
                list = mgrService.getMgrByTime(Long.valueOf(meet), time.getTime());  
            }
            //遍历list集合
            for (int i = 0; i < list.size(); i++) {
                //获取集合中对象信息
                Tbmeetmgr t = (Tbmeetmgr)list.get(i);
                //将信息添加到obj——json对象中
                obj.put("id", t.getId());
                obj.put("zhuti", t.getZhuti());
                obj.put("starttime", t.getStarttime());
                obj.put("endtime", t.getEndtime());
                obj.put("stoptime", t.getStoptime());
                System.out.println(obj.toString());
                //将obj对象添加到map集合
                map.put(t.getId()+"", obj);
                System.out.println(map.toString());
            }
            //使用JSONObject构造方法、将map集合转换成json格式
            JSONObject object = new JSONObject(map);
            //将json格式转换成字符串、并赋值给result属性
            result = object.toString();
            System.out.println(result);
            return "success";
      

  10.   

    JSONObject json = JSONObject.fromObject(this.getMgrMeetingList())
    你这是列表啊。那样这样转换的啊。
      

  11.   

    应该这样
    List list = new ArrayList();       
     list.add( "first" );       
     list.add( "second" );       
     JSONArray jsonArray2 = JSONArray.fromObject( list );       
     System.out.println( jsonArray2 );       
    / prints ["first","second"]       
      

  12.   


    其实这些问题google下就出来了。
    解决方法很多的。
      

  13.   

    JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把JSON转回成bean和DynaBean。
      下载地址:http://json-lib.sourceforge.net/
      还要须要的第3方包:
      org.apache.commons(3.2以上版本)
      org.apache.oro
      net.sf.ezmorph(ezmorph-1.0.4.jar)
      nu.xom
      1、List
    boolean[] boolArray = new boolean[]{true,false,true};        
    JSONArray jsonArray1 = JSONArray.fromObject( boolArray );       
    System.out.println( jsonArray1 );       
     // prints [true,false,true]      
        
     List list = new ArrayList();       
     list.add( "first" );       
     list.add( "second" );       
     JSONArray jsonArray2 = JSONArray.fromObject( list );       
     System.out.println( jsonArray2 );       
    / prints ["first","second"]      
     
     JSONArray jsonArray3 = JSONArray.fromObject( "['json','is','easy']" );       
     System.out.println( jsonArray3 );       
     // prints ["json","is","easy"]       
     
     boolean[] boolArray = new boolean[]{true,false,true};     
     JSONArray jsonArray1 = JSONArray.fromObject( boolArray );     
     System.out.println( jsonArray1 );     
      // prints [true,false,true]    
        
      List list = new ArrayList();     
      list.add( "first" );     
      list.add( "second" );     
      JSONArray jsonArray2 = JSONArray.fromObject( list );     
      System.out.println( jsonArray2 );     
      // prints ["first","second"]    
     
      JSONArray jsonArray3 = JSONArray.fromObject( "['json','is','easy']" );     
      System.out.println( jsonArray3 );     
      // prints ["json","is","easy"]   
      

  14.   

    17非常感谢~~~!我的程序List集合返回跟Hibernate挂钩的!
        如果单独运行:
     List list = new ArrayList();     
      list.add( "first" );     
      list.add( "second" );     
      JSONArray jsonArray2 = JSONArray.fromObject( list );     
      System.out.println( jsonArray2 ); 
    也没有问题、刚刚之所以JSONObject这个样子是因为我用Array不行、心寒了、用来玩玩!
        他们都说我的问题在处理Hibernate的级联关系上、有的是说循环list集合中在Hibernate有关联的set(null)全部给null值! 有的是说按照我上面的那种! 也还有别的! 总之google出来的我翻了几页了!改了很多次了还是不行!!!!
      

  15.   

     实在是太头疼了~~~娘的!我直接从新转换一下~~~!在自己写个javaBean接收只、在用一个list集合存储自己写的javaBean在进行json转换、一点错误没有!!!!String meet = request.getParameter("meetId");
           
    List jsonList = new ArrayList();
            
            List list = new ArrayList();
            //如果会议编号不为空
            if(null !=meet && !"".equals(meet)){
                //创建获取星期日期对象
                TimeTake time = new TimeTake();
                //调用查询方法
                list = mgrService.getMgrByTime(Long.valueOf(meet), time.getTime());  
            }
            //遍历list集合
            for (int i = 0; i < list.size(); i++) {
                //获取集合中对象信息
                Tbmeetmgr t = (Tbmeetmgr)list.get(i);
                //这个是我自己写的javaBean
                TbmTest tbm = new TbmTest();
                tbm.setZhuti(t.getZhuti());
                tbm.setChangetime(t.getChangetime());
                tbm.setCreatetime(t.getCreatetime());
                tbm.setEndtime(t.getEndtime());
                tbm.setId(t.getId());
                tbm.setMeetcode(t.getMeetcode());
                tbm.setRe(t.getRe());
                tbm.setStarttime(t.getStarttime());
                tbm.setStatus(t.getStatus());
                tbm.setStoptime(t.getStoptime());
                tbm.setYiti(t.getYiti());
                jsonList.add(tbm);
            }
            //将json格式转换成字符串、并赋值给result属性
            JSONArray json = JSONArray.fromObject(jsonList);
            result = json.toString();
            System.out.println(result);
            return "success";
     非常感谢各位的回复~~~~!非常感谢!!!!
      

  16.   

    我也遇到了这样的问题  好像确实是hibernate关联属性的问题  我把关联的属性去掉了 或者置为空就可以了