意思是出现了死循环,也就是Model之间有循环包含关系;当实体类对象之间有多对多,相互包含时,JSON转换死循环。
解决方法:使用setCycleDetectionStrategy防止自包含
代码如下:
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
JSONObject json =JSONObject.fromObject(model, jsonConfig);
result = json.toString();
依赖的包:
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;
第二个问题:Json中的日期转换
例于:
public String findOfficeIfStock(String flag) {
List<OfficebuildsVO> oVOList = officebuildService.findOfficeByStock(Boolean.valueOf(flag).booleanValue());
String json =JSONArray.fromObject(oVOList).toString();
return json;
}
而前台要的是“yyyy-MM-dd ” 这种。就要用要日期转换;
1.先创建一个类:
//--------------------------------------------------
package com.cloud.space.util;
import java.text.SimpleDateFormat;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
/**
* Json数据中的Date转换成相应该的格式
* @author zhoujf *
*/
public class DateJsonValueProcessor implements JsonValueProcessor
{
private String format;
public DateJsonValueProcessor(String format){
this.format = format;
}
public Object processArrayValue(Object value, JsonConfig jsonConfig)
{
return null;
}
public Object processObjectValue(String key, Object value, JsonConfig jsonConfig)
{
if(value == null)
{
return "";
}
if(value instanceof java.sql.Timestamp)
{
String str = new SimpleDateFormat(format).format((java.sql.Timestamp)value);
return str;
}
if (value instanceof java.util.Date)
{
String str = new SimpleDateFormat(format).format((java.util.Date) value);
return str;
}
return value.toString();
}
}
//-------------------------------------------------------------------------
2.在controller中方法中:
//------------------------------------
. . . . . .
List<OfficebuildsVO> officebuildsvo= officebuildsService.findOfficebuildsEntityByPage(page1);
JsonConfig jsoncfg = new JsonConfig();
jsoncfg.registerJsonValueProcessor(java.util.Date.class,new DateJsonValueProcessor("yyyy-MM-dd"));
String result =JSONObject.fromObject(officebuildsvo,jsoncfg).toString();
return result;
//------------------------------------
这样 result 中的ptime的值就是"1996-10-20" 了。
注意 导的包:
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;