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里面莫名其妙的执行完毕!不知道错在什么地方、希望各位给看看!感激不尽!
我的配置跟页面都没有问题~~~!因为下面的测试可以正常提交跟响应!
但是在执行这一句的时候(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里面莫名其妙的执行完毕!不知道错在什么地方、希望各位给看看!感激不尽!
在转化成json格式的时候出现的!
这句代码:JSONObject json = JSONObject.fromObject(this.getMgrMeetingList())
因为Hibernate中设置了自身关联:对象类.hbm.xml:
<many-to-one lazy="false" cascade="none">
<column name="group_id" />
</many-to-one>
起初想通过hibernate来解决问题,就是想过滤掉自身关联后来查资料发现不可能实现,最后找到通过JSON-LIB来过滤关联的集合属性,代码如下:
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楼说自己写一个转换类!!!
我也想啊! 自己写的转换类有问题: //获取会议室编号
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";
你这是列表啊。那样这样转换的啊。
List list = new ArrayList();
list.add( "first" );
list.add( "second" );
JSONArray jsonArray2 = JSONArray.fromObject( list );
System.out.println( jsonArray2 );
/ prints ["first","second"]
其实这些问题google下就出来了。
解决方法很多的。
下载地址: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"]
如果单独运行:
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出来的我翻了几页了!改了很多次了还是不行!!!!
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";
非常感谢各位的回复~~~~!非常感谢!!!!